【问题标题】:How to shutdown Python Process Pools properly?如何正确关闭 Python 进程池?
【发布时间】: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.ThreadPoolExecutorp.shutdown()。在所有其他包装中,我都面临同样的问题。这里停滞进程的数量比multiprocessing.Pool中的多

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

【问题讨论】:

    标签: python multiprocessing python-multiprocessing concurrent.futures pathos


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-01
      • 2013-02-13
      • 2016-12-23
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2020-07-08
      相关资源
      最近更新 更多