gpt4 book ai didi

python线程池不等待进程结束

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:19 24 4
gpt4 key购买 nike

我已经使用多处理一段时间了,有一些事情让我感到困惑。我写了这个简单的代码来说明问题:

from multiprocessing.pool import ThreadPool #I import the packages needed
from time import sleep

def long_task(n): #a simple long task
sleep(1)
print str(n)+" task finished"


pool = ThreadPool(8) #define my threadpool

for x in xrange(10**7): #it could be a while loop too
print x
pool.apply_async(long_task, args=(x,))

for 循环中,我希望我的代码等到 8 个线程之一完成后再启动另一个线程,但是 x 正在打印而没有任何中断。为什么会发生这种情况?我如何获得我正在寻找的东西?这段代码优化了吗?

示例输出:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

最佳答案

您遇到的部分困惑是您正在尝试启动 10**7 任务。为了进行实验,请将其减少到某个合理的数字,例如 30。您的输出现在将是

0
1
2
...
27
28
29

然后,大约一秒钟后,类似的事情

2 task finished3 task finished
0 task finished1 task finished


5 task finished4 task finished6 task finished


7 task finished

文本将被打乱,在我的例子中,换行符通常是批量打印的。这是因为对 print 的调用未正确同步。大约一秒后将打印下一批:

13 task finished
11 task finished9 task finished8 task finished12 task finished
10 task finished

与第三批类似。最后一批将仅包含最后 6 个输出 (24-30):

24 task finished
25 task finished
26 task finished
29 task finished27 task finished

28 task finished

要记住的是,任务是立即安排的。这就是线程池的目的。这意味着它们只是被添加到稍后运行的列表中,这就是为什么您会立即看到 x 的打印输出。正如您所期望的,这些任务实际上一次运行八个。实际上,第一批之后的任务是在线程可用时逐个启动的,但由于它们花费的时间几乎完全相同,因此看起来好像它们是分批运行的。

您可以设置一个实验,看看当一半任务需要 1 秒运行而另一半任务需要 2 秒运行时会发生什么情况。虽然它们将按照您将其添加到队列中的顺序立即启动,但 1 秒任务的线程的可用速度将是 2 秒任务的线程的两倍。

关于python线程池不等待进程结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43639442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com