繁体   English   中英

如何正确关闭 Python 进程池?

[英]How to shutdown Python Process Pools properly?

我有一个用例,我必须处理一些文档并且需要一些时间。 因此,我尝试对文档进行批处理并对其进行多处理,效果很好,并且按预期在更短的时间内完成。 还有处理文档的多个阶段,我在所有阶段单独使用了多处理。 当我触发多个并发请求进行处理时,在处理了大约 70 多个请求后,我注意到一些进程没有被杀死。

我正在用 locust 执行负载测试,我创建 5 个用户,等待时间为 4 - 5 秒,每个请求大约需要 3.5 秒,所以我尝试了多处理 package 和其他各种包装器(卵石、并行执行、悲怆、并发期货)。

我基本上做的是,

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 。池

我需要帮助来找到这样做的原因或正确的方法。 任何帮助将非常感激!

要正确关闭池,只需调用:

Pool.close()  # terminate worker processes when all work already assigned has completed
Pool.join()  # wait all processes to terminate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM