Python:从队列中读取会降低写入队列的能力吗?

时间:2016-11-01 21:06:16

标签: python multiprocessing python-multiprocessing

在使用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

0 个答案:

没有答案