Python线程化不能提高性能

rkkpypqq  于 2023-05-08  发布在  Python
关注(0)|答案(1)|浏览(139)

我试过线程的问题,我登录到多个设备,并记录数据。我读过几篇关于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())
hmmo2u0o

hmmo2u0o1#

您的问题是在启动线程后等待线程完成。这种逻辑基本上是顺序的,而不是并行的。你应该首先创建并启动所有的线程,将它们保存在某个地方,并在所有线程启动后等待它们。下面是一个例子:

# Create and run threads
threads = []
for data in self.json_data:
    # prepare your connect handler...
    thread = threading.Thread(..., daemon=True)
    thread.start()
    threads.append(thread)

# Wait for all threads to complete
for thread in threads:
    thread.join()

相关问题