多处理队列似乎很慢?

时间:2018-10-22 19:00:50

标签: python multiprocessing

我有一个需要单独处理的项目的输入列表,因为处理它们需要一个API调用(我没有写过并且不能更改),该调用有时会杀死当前进程(不抛出异常)。每次我处理一个项目时,都会返回很大的结果。

我尝试实现的解决方案是为每个项目创建一个流程,然后将结果与多处理队列一起传回。 AFAIK我不能使用multiprocessing.pool(),因为有时工作进程可能在完成之前被杀死。

我编写了一个小的测试脚本,该脚本本质上实现了一个多处理池,该池不关心工作进程是否被杀死,而只是尝试尽可能多地检索结果。

但是,使用多处理队列传递较大的结果似乎很慢,但是可能有些地方做错了,因为当我查看任务管理器时,发现有很多未使用的CPU时间。多处理队列是瓶颈吗?我有什么办法可以加快速度?

import multiprocessing, sys, os, datetime

def job(q, input_number):
    if input_number in [3, 5, 16]: # randomly kill some processes
        os.kill(multiprocessing.current_process().pid, 9)
    q.put([[i*input_number for i in range(0,100000)], multiprocessing.current_process().pid]) # slow

if __name__ == "__main__":
    print(datetime.datetime.now())
    print("\nStarting...")

    q = multiprocessing.Queue()

    inputs = range(0,3000)

    process_results = []
    MAX_GROUP_SIZE = 30
    input_index = 0
    processes = []

    print("number of inputs: " + str(len(inputs)))

    while input_index < len(inputs) or len([p for p in processes if p.is_alive()]) or not q.empty():
        if len(multiprocessing.active_children()) < MAX_GROUP_SIZE and input_index < len(inputs):
            p = multiprocessing.Process(target=job, args=(q,inputs[input_index]))
            input_index += 1
            processes.append(p)
            p.start()

        # join and terminate any processes that have completed
        while not q.empty():
            return_value = q.get()
            result = return_value[0]
            pid = return_value[1]
            dead_process = [p for p in processes if p.pid == pid][0]
            dead_process.join()
            dead_process.terminate()
            process_results.append(result)

    print("\nnumber of results: " + str(len(process_results)))
    print("\nDone.\n")
    print(datetime.datetime.now())

0 个答案:

没有答案