Python多处理池挂在ubuntu服务器上

Posted

技术标签:

【中文标题】Python多处理池挂在ubuntu服务器上【英文标题】:Python multiprocessing Pool hangs on ubuntu server 【发布时间】:2015-10-18 06:10:56 【问题描述】:

我正在使用 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 worker 只是超时并重新启动。

非常感谢任何关于为什么会发生这种情况和/或我如何解决它的迹象。谢谢。

【问题讨论】:

您在启动这些进程之前是否启动了任何线程? “那个观点”是什么意思?如果进程挂起,可能是因为它从父进程、祖父进程或曾祖父进程继承了错误的同步状态。确保这种情况永远不会发生的最好的(可能是唯一的)方法是在任何线程启动后永远不要启动进程。 您使用的是哪个版本的 Python? 使用 Python 2.7 版 【参考方案1】:

这似乎是Using python's Multiprocessing makes response hang on gunicorn 的变体,所以这可能是一个骗局。

也就是说您必须使用多处理 (MP) 吗?老实说,你可能会更好地把它种在芹菜之类的东西上。由于拥有 MP 进程,MP 在死时可能会与 gunicorn worker 一起被杀死。根据服务器配置,这可能会经常发生。如果您有一些运行时间很长的工作,您仍然可以将其移植到 Celery,这只是更多的配置。

【讨论】:

Django 和 Gunicorn 不适合长期连接,因此对 Celery 建议 +1。如果任务很长,它不应该阻塞连接(并且应该在其他地方完成)。如果任务很短......那为什么还要多处理呢?【参考方案2】:

你在使用一些异步 Gunicorn 工作者吗?如果是这样,请尝试使用默认同步工作线程,看看是否可以重现问题。

如果问题只能在使用 async worker 时重现,您应该确保 multiprocessing 模块已正确修补。

【讨论】:

我不确定我得到了你的答案。打补丁多处理模块是什么意思? 看起来它与 gevent 有关,我将其用作 gunicorn 的工人阶级。删除它至少可以解决悬挂问题。知道如何让它与 gevent 一起工作吗?【参考方案3】:

改变

pool = Pool(processes = cpu_count)

pool = Pool(cpu_count)

这假设您已经从多处理导入 Pool,否则您需要这样做

multiprocessing.Pool(cpu_count)

【讨论】:

欣赏这个建议,但这会导致同样的问题。在我的本地机器上运行,但在我的服务器上挂起。 两台机器上的python版本是一样的吗? 不,我的本地机器有 2.7.5,而服务器有 2.7.6。当我查看 2.7.6 的发行说明时,它看起来像是所有错误修复,我没有看到任何表明它创建了新问题的信息。【参考方案4】:

我遇到了类似的问题。我通过给每个 gunicorn worker 一个固定数量的任务来执行设置maxtasksperchild 参数来解决这个问题,比如Pool(..., maxtasksperchild=1)。这样,每个 gunicorn 工人在完成给定任务后都会自动释放。

这就是 Pool documentation 告诉我们的:

池中的工作进程通常在池的工作队列的整个持续时间内存在。在其他系统(如 Apache、mod_wsgi 等)中发现的一种常见模式是释放工作人员持有的资源,即允许池中的工作人员在退出、清理和产生新进程之前只完成一定数量的工作替换旧的。池的 maxtasksperchild 参数向最终用户公开了这种能力。

【讨论】:

以上是关于Python多处理池挂在ubuntu服务器上的主要内容,如果未能解决你的问题,请参考以下文章

多处理池挂起

如何让 virtualenv 在 Ubuntu 上使用 dist-packages?

Vagrant 挂在 Ubuntu 14.04 上的 NFS 挂载

无法运行简单的程序 - Python - Kivy - Ubuntu

Python 多处理以僵尸结尾

尝试python多处理的Windows上的RuntimeError