我试过线程的问题,我登录到多个设备,并记录数据。我读过几篇关于Netmiko线程的文章,但我似乎无法让线程工作。代码从主脚本调用其他类。这是一个有线程的例子,有没有线程都是18秒。网络设备使用I/O操作,这段代码也是如此,因此线程优先于池。
thread_pool = Queue()
Hardware = HardwareMaintenance.hardware_handler
ip_pool = Queue()
function_list = []
thread_list = []
class Connect:
def __init__(self,):
intake_file = open('ip_list.txt', 'r')
self.json_data = [json.loads(line) for line in intake_file]
pass
def connect_parser(self, ):
for data in self.json_data:
ip = data["ip"]
ip_pool.put(ip)
username = data["username"] if data["username"] else ""
password = data["password"] if data["password"] else ""
secret = data["secret"] if "secret" in data else False
device_type = data["device_type"] if data["device_type"] else ""
if data["header"] == "Netmiko":
print("The variables being passed: " + ip, username, password, device_type)
ConnectHandler = netmiko.ConnectHandler(
device_type=device_type,
host=ip,
username=username,
password=password,
port=22,
secret=data["secret"] if "secret" in data else False)
if ConnectHandler:
try:
ConnectHandler.enable()
except Exception as e:
print("Could not connect to {}".format(ip))
thread_pool.put(ConnectHandler)
conn = thread_pool.get(block=False)
host = ip_pool.get(block=False)
res = threading.Thread(target=Hardware, args = (conn, host), daemon=True)
res.start()
res.join()
if __name__ == "__main__":
functions = {'Hardware': Hardware}
from main import Connect
Connector = Connect()
Connector.connect_parser()
我在main下尝试了上下文管理器,并且总是同时执行。
我不确定是否有什么我错过了,或者如果我使用线程正确,任何建议将不胜感激。
我想也许18秒是一个很好的开始时间~但是我读过一些使用线程和网络设备的文章,他们的时间似乎大大提高了使用线程。
好的,我通过取消缩进连接来工作,在线程开始后首先将线程放入列表中,然后加入它们,而不是在执行时加入它们,因为我认为这样做并没有真正加入它们。我仍然不清楚为什么上下文管理器不能在main下工作。如果有任何人有洞察力请让我知道,谢谢。这个代码把它从18秒降到了12秒。这是一个重大的改进,如果我运行的代码对数百或更多的设备,并调用更多的类。注意下面的最后几行代码让它为我工作。
def looper():
while not thread_pool.empty():
conn = thread_pool.get(block=False)
host = ip_pool.get(block=False)
print("host " + host)
res = threading.Thread(target=Hardware, args = (conn, host), daemon=True)
res.start()
print(res.__repr__())
thread_list.append(res)
#main_thread = threading.current_thread()
#main_thread = current_thread()
for i in thread_list:
i.join()
print("This is the threads list")
print(i.__repr__())
if __name__ == "__main__":
from main import Connect
Connector = Connect()
print(Connector)
print(time.perf_counter())
Connector.connect_parser()
# with ThreadPoolExecutor(max_workers=8) as exe:
# exe.submit(Connector.connect_parser())
print(time.perf_counter())
1条答案
按热度按时间hmmo2u0o1#
您的问题是在启动线程后等待线程完成。这种逻辑基本上是顺序的,而不是并行的。你应该首先创建并启动所有的线程,将它们保存在某个地方,并在所有线程启动后等待它们。下面是一个例子: