我遇到了一些多线程代码的性能问题,无法并行化多个telnet探测器。
我的第一个实现是非常缓慢,如果任务按顺序运行,则相同:
for printer in printers:
…
thread = threading.Thread(target=collect, args=(task, printers_response), kwargs=kw)
threads.append(thread)
for thread in threads:
thread.start()
thread.join()
for printer in printers:
…
thread = threading.Thread(target=collect, args=(task, printers_response), kwargs=kw)
threads.append(thread)
thread.start() # <----- moved this
for thread in threads:
thread.join()
我不明白为什么移动start()
方法会如此改变性能。
答案 0 :(得分:4)
答案 1 :(得分:1)
thread.join()一旦在第一个实现中创建它们就会阻塞每个线程。
答案 2 :(得分:1)
等到线程终止。 这将阻塞调用线程,直到调用join()方法的线程终止 - 正常或通过未处理的异常或直到可选的超时发生&#34;。
在 slow 示例中,启动线程并等待它完成,然后迭代到下一个线程。
from threading import Thread
from time import sleep
def foo(a, b):
while True:
print(a + ' ' + b)
sleep(1)
ths = []
for i in range(3):
th = Thread(target=foo, args=('hi', str(i)))
ths.append(th)
for th in ths:
th.start()
th.join()
hi 0
hi 0
hi 0
hi 0
答案 3 :(得分:0)
在你的慢速解决方案中,你基本上根本不使用多线程。我正在运行一个线程,等待完成它然后再运行另一个线程 - 在一个线程和此解决方案中运行所有内容没有区别 - 您正在运行它们。
另一方面,第二个启动所有线程,然后加入它们。此解决方案将执行时间限制为单个线程的最长执行时间 - 您并行运行它们。