我从以下问题的接受答案中获得了以下代码。当我在我的Windows 10 x64bit计算机上运行它时,在Python 3.5.1中启动线程,但只有其中一个显示任何CPU使用情况,而且它很少。当发生这种情况时,终端正在从print语句向上滚动数字,因此它正在运行...当我运行其他使用循环的python脚本时,我看到脚本的CPU使用率为13.5%。我希望看到这个旋转4个线程,每个CPU占用率为13.5%。 我通过Windows命令提示符运行脚本,这些是运行的唯一5个python进程。当我按Ctrl + C存在脚本时,所有进程都会停止。
为什么这不按预期工作?
问题: 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()
感谢您的时间。
答案 0 :(得分:3)
你没有在这里异步运行任何东西;在传递给异步工作者之前调用函数。你应该传递callable,而不是结果:
pool.apply_async(do_job, (first_bit,))
另请注意,apply_async
的返回值是AsyncResult个实例:当您计算工作人员的事情时,您需要在这些值上调用get()
- 再次,在所有过程完成后 - 实际得到结果。