Python multiprocessing.Pool 不会立即启动

标签 python multiprocessing pool

我想将文本输入到 python 并并行处理它。为此,我使用了 multiprocessing.Pool。问题是有时,并非总是如此,我必须在处理任何内容之前多次输入文本。

这是我用于重现问题的代码的最小版本:

import multiprocessing as mp
import time

def do_something(text):
    print('Out: ' + text, flush=True)
    # do some awesome stuff here

if __name__ == '__main__':
    p = None
    while True:
        message = input('In: ')
        if not p:
            p = mp.Pool()
        p.apply_async(do_something, (message,))

发生的情况是,无论我在第一次输入内容后等待多长时间,我都必须多次输入文本才能得到结果。 (如上所述,并非每次都会发生这种情况。)

python3 test.py
In: a
In: a
In: a
In: Out: a
Out: a
Out: a

如果我在 while 循环之前创建池,或者如果我在创建池之后添加 time.sleep(1),它似乎每次都有效。注意:我不想在收到输入之前创建池。

有人对此行为有解释吗?

我正在使用 Python 3.4.2 运行 Windows 10 编辑:与 Python 3.5.1 相同的行为


编辑:

使用 Pool 和 ProcessPoolExecutor 的更简单示例。我认为问题是在应用/提交后立即调用 input(),这似乎只是第一次应用/提交时的问题。

import concurrent.futures
import multiprocessing as mp
import time

def do_something(text):
    print('Out: ' + text, flush=True)
    # do some awesome stuff here

# ProcessPoolExecutor
# if __name__ == '__main__':
#     with concurrent.futures.ProcessPoolExecutor() as executor:
#         executor.submit(do_something, 'a')
#         input('In:')
#         print('done')

# Pool
if __name__ == '__main__':
    p = mp.Pool()
    p.apply_async(do_something, ('a',))
    input('In:')
    p.close()
    p.join()
    print('done')

最佳答案

当我在我的 Mac 上尝试时,您的代码有效。

在 Python 3 中,明确声明您的池中将有多少处理器(即并发进程数)可能会有所帮助。

尝试使用 p = mp.Pool(1)

import multiprocessing as mp
import time

def do_something(text):
    print('Out: ' + text, flush=True)
    # do some awesome stuff here

if __name__ == '__main__':
    p = None
    while True:
        message = input('In: ')
        if not p:
            p = mp.Pool(1)
        p.apply_async(do_something, (message,))

关于Python multiprocessing.Pool 不会立即启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919678/

相关文章:

Go 计算虚拟内核,而不是物理内核?

multiprocessing - 为什么在 Python3.8+ "fork"中使用 "spawn"有效但使用 `multiprocessing` 失败?

java - 为什么没有类似于字符串池的整数池呢?

python - 从单个 FTP 服务器进行多线程/异步下载

caching - 缓存/池/缓存池的指南/差异

python - Dask Bag of dicts 到 Dask 数组

php - arc lint 命令失败并出现错误 #1

python - 如何使用元类作为 django.contrib.auth.models.User 创建注册表单(ModelForm)?

python - concurrent.futures 与 Python 中的多处理相比有哪些优势?

python - pandas.DataFrame.to_dict 行为