在使用Python的多处理模块时遇到了一个非常令人费解的问题。
设置非常典型。我的机器有32个内核和244 GB的RAM(谢谢你的AWS)。写入提取队列的一个进程。 N进程完成我需要完成的工作,process_data()。 M进程进行一些preaggregation,preaggregate_results()。进行最终聚合并写入输出的一个过程。
如果N为'大'且M仅为1或2,则process_data()非常快。它基本上跟上了摄取过程。但由于M非常小,预聚集相对较慢,并且intermediate_results队列膨胀。
这是问题的核心。 M的每次增加都会导致process_data()写入intermediate_results队列的能力降低MARKED。事实上,如果N == M == 12,那么这个过程太慢了,等待工作完成甚至都是不合理的。 process_data()从摄取队列的起搏变为灰尘。
我在下面列出了一些骨架代码,仅概述了我正在讨论的工作流程。这不是字面意思。我很好奇是否有其他人以前遇到过这个问题并且知道如何解决它。我跟很多同事谈过(包括代码审查),他们和我一样难过。
我一直使用多处理成功。这是我第一次遇到这个问题。任何想法都将不胜感激。
from multiprocessing import Process, Queue
import pandas as pd
import csv
KILL_TOKEN = 'STOP'
NUM_PROCESS_DATA = 14
NUM_PROCESS_PREAGGREGATE = 1
def ingest_data(ingestion_queue):
...pandas data munging
for blah in univariate_data.itertuples():
... write to ingestion_queue
def process_data(ingestion_queue, intermediate_results):
while True:
data = ingestion_queue.get()
if data == KILL_TOKEN:
break
... process data
... write to intermediate_results
def preaggregate_results(intermediate_results, output_queue):
while True:
data = intermediate_results.get()
if data == KILL_TOKEN:
break
... preaggregation
... write to output_queue after kill token is received
def process_output(output_queue):
while True:
data = output_queue.get()
if data == KILL_TOKEN:
break
... final aggregation
... write results
if __name__ == '__main__':
... the usual