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

标签 python multithreading

我用 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/

    相关文章:

    python - 为什么线程中的定时器不能在多进程的进程中工作?

    python - 通过numpy中的索引数组从另一个矩阵填充空矩阵的行

    python - Python 的 MySQL 模块

    使用用户输入控制 POSIX 线程

    java-为什么同步块(synchronized block)没有给出正确的循环结果

    python - 为什么捕获 Exception 而不是更具体的 URLError 是不行的?

    python - Django 模型不会保存到 Celery Task 中的数据库中

    JavaFX : How to populate data to TableView from different Thread(Netty)

    C# DispatcherOperation 循环永不中断

    ios - 如何重构我的代码以在主线程上调用 AppDelegate?