这可能是一个愚蠢的问题。但是,我正在寻找一种有效的 Python 方法来跟踪问题。
我有一个process A
,它不断生成一些文档(一个计算繁重的过程(。
我必须运行process B
使用来自 A 的输出(作为单个文档或一批文档(并将其插入 MongoDB。(batch is preferable
(。
从 A 到 B 的管道最有效方法是什么?管道是这里最好的方法吗?
我可以等待 A 完成,然后等待 B 开始。但我觉得它没有效率。
tl;DR:使用多处理
听起来 A 可能需要> B 花费 10 倍的时间。 如果是这样,那么只需使用check_output。 让 B 耐心等待 A 孩子将文档发送到标准输出, 然后将文档插入数据库。
或者,也许A和B需要相当的时间, 并且批处理是可取的。 有一堆A作业写信给/tmp/temp.${PID}
, 然后mv
(os.rename()
(完成的文件 到/tmp/out/
目录中。 让 B 定期将此类文件铲入数据库, 随时取消链接。
无论哪种方式,您都将咀嚼大量的CPU周期 当您的for
循环访问许多输入时, 并且您希望保持多个核心忙碌。 输入多处理。
将您的for
循环转换为map
调用, 例如:list(map(str, range(3)))
将把[0, 1, 2]
变成['0', '1', '2']
. 当然,你的功能会更多 计算密集度比str
.
有了这个,你处于一个很好的位置 掏出一堆孩子,他们都会 运行相同的函数:
with multiprocessing.Pool() as p:
p.map(my_func, bunch_of_inputs)