我有一个需要单独处理的项目的输入列表,因为处理它们需要一个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())