从队列处理时Multiproccess Pool的不规则行为

时间:2017-02-23 17:01:08

标签: python python-3.x multiprocessing

我有一个脚本可以分析不规则大小的记录的大文本文件(~5.5GB),并将每条记录发送到JoinableQueue tasks。这些任务由一组工作人员处理,他们将结果放入另一个JoinableQueue results。尝试与另一个工作池同时处理此队列时出现问题。这是我目前的一个小例子。

def process_nodes(results_queue, return_dict):
    while True:
        node_pairs = results_queue.get()
        results_queue.task_done()
        if node_pairs is None:
            results_queue.task_done()
            break
        for key in node_pairs:
            return_dict[tuple(key)] += 1

if __name__ == '__main__':
    num_workers = mp.cpu_count() * 2
    tasks = mp.JoinableQueue()
    results = mp.JoinableQueue()
    parser = ParseVehicleTrajectories('VehTrajectory_1.dat', tasks)
    task_workers = [TaskWorker(tasks, results) for i in range(num_workers - 2)]
    for worker in task_workers:
        worker.start()
    manager = MyManager()
    manager.start()
    return_dict = manager.defaultdict(int)
    results_worker = mp.Process(target=process_nodes, args=(results, return_dict))
    results_worker.start()
    parser.run()
    for _ in range(num_workers - 2):
        tasks.put(None)
    results.put(None)
    tasks.join()
    print(len(return_dict), sum(return_dict.values()))

ParseVehicleTrajectories是读取文件并将记录推送到队列的类。 TaskWorker是工作类,继承自mp.Process

我的问题是,有时这段代码会正常运行并打印结果,有时则不会。如果没有,则results似乎尚未用尽且results_worker已停止。我承认我不是多处理的主人,所以有可能我错过了一些明显的东西,但是我已经彻底地完成了,并且无法找到解决方案。

0 个答案:

没有答案