[英]Python multiprocessing Pool hangs on ubuntu server
我在带有 nginx 和 gunicorn 的 Ubuntu 服务器上运行 Django。 我正在尝试做一些在我的本地机器上工作的多处理,但在我的服务器上的 gunicorn 工人超时之前挂起。
cpu_count = int(multiprocessing.cpu_count())
pool = Pool(processes = cpu_count)
result = pool.map_async(apiSimulAvail, rate_ranges)
result.wait()
...do some more stuff once all processes return
它挂在pool = Pool(processes = cpu_count)
。 我没有收到任何错误,gunicorn 工人只是超时并重新启动。
任何关于为什么会发生这种情况和/或我如何解决它的迹象都非常感谢。 谢谢。
这似乎是Using python's Multiprocessing make response hang on gunicorn 的一个变体,所以这可能是一个骗局。
那是说您必须使用多处理 (MP) 吗? 老实说,你可能会得到更好的服务,把它种植到像芹菜这样的东西上。 MP 可能会在 gunicorn 工人死亡时被杀死,因为它拥有 MP 进程。 根据服务器配置,这可能会经常发生。 如果你有一些运行时间很长的工作,你仍然可以把它交给 Celery,这只是更多的配置。
你在使用一些异步 Gunicorn 工人吗? 如果是这样,请尝试使用默认的同步工作器,看看是否可以重现该问题。
如果问题只能在使用异步工作者时重现,则应确保正确修补multiprocessing
模块。
改变
pool = Pool(processes = cpu_count)
到
pool = Pool(cpu_count)
这假设您已从多处理导入 Pool 否则您需要执行
multiprocessing.Pool(cpu_count)
我有一个类似的问题。 我通过为每个 gunicorn 工人提供固定数量的任务来执行设置maxtasksperchild
参数来解决它,例如Pool(..., maxtasksperchild=1)
。 通过这种方式,每个 gunicorn 工人在完成给定的任务后会自动释放。
这是 Pool文档所说的:
池中的工作进程通常在池的工作队列的整个持续时间内都存在。 在其他系统(例如 Apache、mod_wsgi 等)中发现的一种常见模式,用于释放工作人员持有的资源,是允许池中的工作人员在退出、清理和产生新进程之前仅完成一定数量的工作替换旧的。 Pool 的 maxtasksperchild 参数向最终用户公开了这种能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.