Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python线程池未等待进程结束_Python_Multithreading_Python 2.7_Optimization_Threadpool - Fatal编程技术网

python线程池未等待进程结束

python线程池未等待进程结束,python,multithreading,python-2.7,optimization,threadpool,Python,Multithreading,Python 2.7,Optimization,Threadpool,我已经玩了一段时间的多重处理,有一些东西让我困惑。 我编写了以下简单代码来说明问题: 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) #

我已经玩了一段时间的多重处理,有一些东西让我困惑。 我编写了以下简单代码来说明问题:

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):

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


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

请提供一个示例输出<代码>打印x应立即运行10**7次
print str(n)+“task finished”
将在每批8个字符之间延迟1秒运行。像这样吗@没错。同样在10**7-1计数结束时,我的答案中应该会显示一些表格的打印件。谢谢这很有帮助,我理解了,我会尽快接受你的答案,但是如果我必须执行10**9任务呢?这对记忆演讲不好吗?不应该。如果您一次只运行8,那么为输入和输出创建数组应该不会有问题。只是补充一下,您不应该使用
ProcessPool
而不是
ThreadPool
吗?鉴于此任务不是I/O密集型任务,即使这可能不是您计划使用的,您可以更详细地解释一下吗?也许在回答中,或者在评论中@DmitryPolonskiy@Liampost更详细地解释了何时使用
ThreadPool
24 task finished
25 task finished
26 task finished
29 task finished27 task finished

28 task finished