与start()相关的Python多线程性能问题

时间:2016-09-06 08:14:27

标签: python performance python-3.x telnet python-multithreading

我遇到了一些多线程代码的性能问题,无法并行化多个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()

Blastlingly Fast

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()方法会如此改变性能。

4 个答案:

答案 0 :(得分:4)

在您的第一个实现中,您实际上是按顺序运行代码,因为join()主线程被阻止之后立即调用start() ,直到启动的线程完成为止。

答案 1 :(得分:1)

thread.join()一旦在第一个实现中创建它们就会阻塞每个线程。

答案 2 :(得分:1)

根据threading.Thread.join()文件:

  

等到线程终止。   这将阻塞调用线程,直到调用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)

在你的慢速解决方案中,你基本上根本不使用多线程。我正在运行一个线程,等待完成它然后再运行另一个线程 - 在一个线程和此解决方案中运行所有内容没有区别 - 您正在运行它们。

另一方面,第二个启动所有线程,然后加入它们。此解决方案将执行时间限制为单个线程的最长执行时间 - 您并行运行它们。