【发布时间】:2020-06-25 17:29:10
【问题描述】:
我有一个用例,我必须处理一些文档,这需要一些时间。因此,我尝试对文档进行批处理并对其进行多处理,效果很好,并且按预期在更短的时间内完成。还有处理文档的多个阶段,我在所有阶段单独使用多处理。当我触发多个并发请求进行处理时,在处理了大约 70 多个请求后,我注意到一些进程没有被杀死。
我正在使用 locust 执行负载测试,我创建 5 个用户,等待时间为 4-5 秒,每个请求大约需要 3.5 秒,所以我尝试了多处理包和其他各种包装器(卵石,并行执行,悲情,并发。未来)。
基本上我做的是,
from multiprocessing import Pool
with Pool(processes=5) as p:
out = p.starmap(do_something, args)
p.close()
p.terminate()
官方文档还说执行后将关闭池,同时这样做with。当我停止请求触发时,最后一两个请求停滞不前。我通过在处理前后打印“Started {req_num}”和“Served {req_num}”来发现这一点。在添加 p.close() 和 p.terminate() 之前,我可以看到在停止触发请求后正在运行更多进程。添加它们后,仅不提供最后触发的进程。现在,如果我开始触发请求并在一段时间后再次停止它们,那么最后一个或两个相同的请求不会得到服务,并且它们的进程停滞不前。所以停滞的过程不断累积。
我提到的每个包装器都有不同的关闭池的方式。我也试过了。就像悲伤一样,
p = Pool(processes=5)
out = p.map(do_something, args)
p.join()
p.close()
p.terminate()
concurrent.future.ThreadPoolExecutor 是p.shutdown()。在所有其他包装中,我都面临同样的问题。这里停滞进程的数量比multiprocessing.Pool中的多
我需要帮助来找到这样做的原因或正确的方法。任何帮助将不胜感激!
【问题讨论】:
标签: python multiprocessing python-multiprocessing concurrent.futures pathos