Python多处理启动进程,但只有一个处于活动状态

时间:2016-06-07 12:27:32

标签: python multithreading python-3.x

我从以下问题的接受答案中获得了以下代码。当我在我的Windows 10 x64bit计算机上运行它时,在Python 3.5.1中启动线程,但只有其中一个显示任何CPU使用情况,而且它很少。当发生这种情况时,终端正在从print语句向上滚动数字,因此它正在运行...当我运行其他使用循环的python脚本时,我看到脚本的CPU使用率为13.5%。我希望看到这个旋转4个线程,每个CPU占用率为13.5%。 我通过Windows命令提示符运行脚本,这些是运行的唯一5个python进程。当我按Ctrl + C存在脚本时,所有进程都会停止。

为什么这不按预期工作?

enter image description here

问题: How do I "multi-process" the itertools product module?

接受的答案代码:

#!/usr/bin/env python3.5
import sys, itertools, multiprocessing, functools


alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts

def do_job(first_bits):
    for x in itertools.product(first_bits, alphabet, alphabet, alphabet):
        print(x)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = []
    for i in range(num_parts):
        if i == num_parts - 1:
            first_bit = alphabet[part_size * i :]
        else:
            first_bit = alphabet[part_size * i : part_size * (i+1)]
        results.append(pool.apply_async(do_job(first_bit)))

    pool.close()
    pool.join()

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

你没有在这里异步运行任何东西;在传递给异步工作者之前调用函数。你应该传递callable,而不是结果:

pool.apply_async(do_job, (first_bit,))

另请注意,apply_async的返回值是AsyncResult个实例:当您计算工作人员的事情时,您需要在这些值上调用get() - 再次,在所有过程完成后 - 实际得到结果。