Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gunicorn工作进程和Heroku工作动态之间的差异_Heroku_Gunicorn - Fatal编程技术网

Gunicorn工作进程和Heroku工作动态之间的差异

Gunicorn工作进程和Heroku工作动态之间的差异,heroku,gunicorn,Heroku,Gunicorn,我希望社区能为我澄清一些事情,其他人也能从中受益 我的理解是,gunicorn worker进程本质上是Heroku web dynos的虚拟副本。换句话说,Gunicorn的工作进程不应与Heroku的工作进程混淆(例如Django芹菜任务) 这是因为Gunicorn worker进程专注于处理web请求(基本上限制Heroku web Dyno的性能),而Heroku worker Dynos专注于远程API调用等长期运行的后台任务 我有一个简单的Django应用程序,可以很好地使用远程AP

我希望社区能为我澄清一些事情,其他人也能从中受益

我的理解是,gunicorn worker进程本质上是Heroku web dynos的虚拟副本。换句话说,Gunicorn的工作进程不应与Heroku的工作进程混淆(例如Django芹菜任务)

这是因为Gunicorn worker进程专注于处理web请求(基本上限制Heroku web Dyno的性能),而Heroku worker Dynos专注于远程API调用等长期运行的后台任务

我有一个简单的Django应用程序,可以很好地使用远程API,我想优化资源平衡。我还在大多数请求上查询PostgreSQL数据库

我知道这在很大程度上过于简单化了,但我的想法正确吗

一些相关信息:

其他准相关问题对研究此主题的人很有帮助:


为了提供答案并防止人们搜索评论,a就像一台完整的计算机。使用,您给每个dynos一个要运行的命令,它会启动该命令,定期重新运行以刷新它,并在崩溃时重新运行它。正如您可以想象的那样,浪费一台运行单线程Web服务器的整个计算机是相当浪费的,这就是原因所在

Gunicorn主线程除了充当代理服务器之外什么都不做,它生成给定数量的应用程序副本(worker),并在它们之间分发HTTP请求。它利用了一个事实,即每个dyno实际上有多个核心。正如有人提到的,你应该选择的工作人员数量取决于你的应用程序运行所需的内存

与Bob Spryn在上一次评论中所说的相反,还有其他方法可以利用这种并行性机会在同一个dyno上运行不同的服务器。最简单的方法是创建一个单独的子procfile,并从主procfile运行与Python等效的程序,如下所示。本质上,在本例中,单个dyno命令是一个管理多个单个命令的程序。这有点像一个精灵许下了一个愿望,然后又许下了4个愿望


这样做的好处是你可以充分利用你的dynos的能力。这种方法的缺点是,当应用程序的各个部分共享dyno时,您将失去独立缩放它们的能力。当你缩放dyno时,它会缩放你复用到它上面的所有东西,这可能不是你想要的。您可能需要使用诊断来决定何时将服务放在自己的专用dyno上。

dyno更像是主机,而gunicorn worker是在该主机上运行的进程。没有一对一的通信,因为在一个dyno上可以运行多个gunicorn工作进程。如果要调整应用程序和堆栈,可以考虑查看新的遗留文件。既然你可以在Heroku上免费访问New Relic标准订阅级别,那么至少尝试一下也无妨。谢谢Graham,我正在使用New Relic,它非常有用。我的理解是heroku dyno是一个单线程、一个进程主机,但gunicorn是一个进程,它可以生成工作进程来并发处理多个web请求。话虽如此,我仍在寻找人来确认gunicorn worker与heroku worker dyno有着本质上的不同。很久以前,Ruby的dynos是一个单线程进程。现在不是这样。实际上,您可以使用foreman在dyno中运行多个进程,对于gunicorn,您可以告诉它运行三个工作进程来处理请求。从技术上讲,我可以(并且正在研究)在一个dyno中运行Apache/mod_wsgi,并拥有多个进程,这些进程都是多线程处理请求的。在newrelic下,dynos选项卡实际上是误导性的,因为它将告诉您任何web进程而不是dynos。它曾经在一对一的情况下起作用,但不适用于新的Heroku dynos,而且现在还没有一个简单的解决方案来修复差异。你完全正确,new Relic在混合中加入了一个新的“dyno”定义。然而,虽然每个网络dyno可以运行~3个gunicorn workers,但它们仍然不能像Heroku worker dynos上的芹菜工人那样运行后台工作,对吗?有没有办法知道Heroku dyno有多少内核?我看不出在dyno中有比核心更多的工人来处理它们有什么意义!如果你的应用程序是I/O绑定的(像大多数应用程序一样),那么无论内核的数量如何,你都可以通过让Gunicorn为每个dyno生成多个worker来获得一些优势。此文档提供了一些好信息:有关不同层的Dyno可以拥有多少操作系统进程的更多信息(请阅读“进程”部分):