【问题标题】:Python multiprocessing starts processes, but only one is activePython多处理启动进程,但只有一个处于活动状态
【发布时间】:2016-06-07 12:27:31
【问题描述】:

我从以下问题中接受的答案中获得了以下代码。当我在 Windows 10 x64bit 机器上运行它时,在 Python 3.5.1 中它会启动线程,但其中只有一个显示任何 CPU 使用率,而且很少。发生这种情况时,终端正在从 print 语句向上滚动数字,因此它正在运行......当我运行其他使用循环的 python 脚本时,我看到脚本的 CPU 使用率为 13.5%。我希望看到这会启动 4 个线程,每个线程具有 13.5% 的 CPU 使用率。 我正在通过 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()

感谢您的宝贵时间。

【问题讨论】:

    标签: python multithreading python-3.x


    【解决方案1】:

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

    pool.apply_async(do_job, (first_bit,))
    

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

    【讨论】:

    • 丹尼尔,感谢您的回复。 “您应该传递可调用对象,而不是结果”到底是什么意思?你是说我应该把这个: results.append(pool.apply_async(do_job(first_bit))) 改成这个: pool.apply_async(do_job(first_bit)) ?
    • 不,您应该使用我在答案中显示的代码。
    • 对不起,我没有注意到额外的括号...我的意思是你说我应该使用你提供的代码。我试过这个,当我运行它时,它会在一秒钟后开始并结束,没有错误,但没有任何东西打印到控制台,也没有启动线程。
    • 抱歉,第二个参数应该是一个元组;现在就试试吧。
    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多