gpt4 book ai didi

python - 遇到同时连接到多个设备的多线程问题

转载 作者:行者123 更新时间:2023-12-03 13:03:10 25 4
gpt4 key购买 nike

我用 def get_info() 定义主函数.此函数不接受参数。该程序使用 argumentParser从命令行解析参数。提供的参数是带有 --csv 的 CSV 文件选项。这会从当前目录中提取 csv 文件并读取每行包含 IP 地址的行,串行登录到设备并运行一些命令,返回输出并附加到文本文件中。当代码运行时,它会从目录中删除旧的文本文件,并在执行时创建一个新的输出文本文件。
问题:我想使用线程模块来实现这一点,这样它就可以并行处理 5 个设备并输出到一个文件中。我正在运行的问题是锁定问题,因为同一个对象同时被同一个进程使用。这是我编写的示例代码。线程概念对我来说很新,所以请理解。

导入getpass
导入 csv
进口时间
导入操作系统
导入netmiko
进口 Paramiko
从 argparse 导入 ArgumentParser
从多处理导入进程,队列

def get_ip(device_ip,output_q):

        try:
ssh_session = netmiko.ConnectHandler(device_type='cisco_ios', ip=device_row['device_ip'],
username=ssh_username, password=ssh_password)
time.sleep(2)
ssh_session.clear_buffer()
except (netmiko.ssh_exception.NetMikoTimeoutException,
netmiko.ssh_exception.NetMikoAuthenticationException,
paramiko.ssh_exception.SSHException) as s_error:
print(s_error)

定义主():
show_vlanfile = "pool.txt"
if os.path.isfile(show_vlanfile):
try:
os.remove(show_vlanfile)
except OSError as e:
print("Error: %s - %s." %(e.filename, e.strerror))

parser = ArgumentParser(description='Arguments for running oneLiner.py')
parser.add_argument('-c', '--csv', required=True, action='store', help='Location of CSV file')
args = parser.parse_args()

ssh_username = input("SSH username: ")
ssh_password = getpass.getpass('SSH Password: ')

with open(args.csv, "r") as file:
reader = csv.DictReader(file)
output_q = Queue(maxsize=5)
procs = []
for device_row in reader:
# print("+++++ {0} +++++".format(device_row['device_ip']))
my_proc = Process(target=show_version_queue, args=(device_row, output_q))
my_proc.start()
procs.append(my_proc)

# Make sure all processes have finished
for a_proc in procs:
a_proc.join()

commands = ["terminal length 0","terminal width 511","show run | inc hostname","show ip int brief | ex una","show

vlan 简介","终端长度 70"]
输出 = ''
对于命令中的 cmd:
输出 += "\n"
输出 += ssh_session.send_command(cmd)
输出 += "\n"
使用 open("pool.txt", 'a') 作为输出文件:
而不是 output_q.empty():
output_queue = output_q.get()
对于 output_queue 中的 x:
输出文件.write(x)

如果 姓名 ==“ 主要”:
主要的()

最佳答案

有点不一样的...
我有效地运行一个主要任务,然后启动(有限)数量的线程;他们通过 2 个数据队列进行通信——基本上是“请求”和“响应”。
主要任务

  • 将请求转储到请求队列中。
  • 启动一些(即 10 个左右......)工作任务。
  • 坐在“响应”队列中等待结果。结果可以是关于状态、错误消息或要写入文件的 DATA 响应的简单用户信息消息。
  • 当所有线程完成时,程序关闭。

  • worker 基本上:
  • 得到一个请求。如果没有,请关闭
  • 连接设备
  • 向它启动的响应队列发送一条日志消息。
  • 做它必须做的事。
  • 将结果作为 DATA 放入响应队列
  • 关闭与设备的连接
  • 循环回到起点

  • 这样你就不会无意中淹没处理主机,因为你有有限数量的并发线程在运行,所有线程都在自己的甜蜜时间做完全相同的事情,直到没有什么可做的。
    请注意,您不要在线程中执行任何屏幕/文件 IO,因为它会与同时运行的不同任务混淆。每个基本上只看到 inputQ、outputQ 和循环通过的 Netmiko session 。

    关于python - 遇到同时连接到多个设备的多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51582217/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com