python - 尝试在使用多处理时追加到列表
问题描述
我已经开始使用 Python 和 Netmiko 连接到 Cisco 设备并将 CLI 命令抓取到数据中。这很好用,但是当有大量设备时,我需要缩短脚本完成所需的时间。
只要我在我正在使用的函数中打印输出,我就可以让多处理工作。但是,当我尝试将共享列表与多处理一起使用时,它会失败。
对于这个例子,我正在生成一个名为“device_list”的字典列表,我称之为“devices.py”:
device_list = []
ip = 211
for x in range(5):
device_list.append({'host': '192.168.0.' + str(ip),
'username': 'myusername',
'password': 'mypassword',
'device_type': 'cisco_ios'})
ip = ip + 1
Netmiko 模块将使用此字典列表连接到我的测试实验室中的设备。
这是主程序:
import multiprocessing as mp
from time import time
from netmiko import Netmiko
from devices import device_list
def connect_to_dev(output, **device):
net_connect = Netmiko(**device)
show_ver = net_connect.send_command('show version', use_textfsm = True)
net_connect.disconnect()
hostname = show_ver[0]['hostname']
image = show_ver[0]['running_image'][28:62]
result = '{}\nHostname: {}, version {}'.format(line, hostname, image)
output.append(result)
if __name__ == '__main__':
line = '*'*70
start = time()
mgr = mp.Manager()
output = mgr.list()
processes = []
for device in device_list:
p = mp.Process(target=connect_to_dev, args=output, kwargs=device)
processes.append(p)
p.start()
for p in processes:
p.join()
end = time()
runtime = round((end - start), 2)
print(output)
print('{}\nTime elapsed: {} seconds\n{}'.format(line, runtime, line))
我试图将“connect_to_dev”函数生成的每个“结果”附加到“输出”列表中。我收到此错误:
Process Process-2:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: connect_to_dev() missing 1 required positional argument: 'output'
Process Process-3:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
Process Process-5:
TypeError: connect_to_dev() missing 1 required positional argument: 'output'
Traceback (most recent call last):
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: connect_to_dev() missing 1 required positional argument: 'output'
Process Process-6:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: connect_to_dev() missing 1 required positional argument: 'output'
Process Process-4:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
TypeError: connect_to_dev() missing 1 required positional argument: 'output'
[]
**********************************************************************
Time elapsed: 0.05 seconds
**********************************************************************
解决方案
推荐阅读
- typescript - 如何在多个(打字稿)文件中使用 GraphQL 片段
- php - Laravel:数据库请求保存虚假数据
- android - Google place api for android 未启用
- c++ - 带有指针的二维数组中的内存泄漏
- python-3.x - 如何从另一个 python 程序运行和退出 python 脚本?
- java - 如何在 ignite 中保存决策树训练模型?
- java - 如何使多个扫描仪具有相同的输入线?
- sql - 如何通过 sql 语句在 SQL Developer 中显示所有创建的表?
- c++ - Qt 在控制台应用程序中录制音频
- php - 无法在我的数据库上发送数据无法理解发生了什么