我有一个脚本可以分析不规则大小的记录的大文本文件(~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
已停止。我承认我不是多处理的主人,所以有可能我错过了一些明显的东西,但是我已经彻底地完成了,并且无法找到解决方案。