Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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
Python web托管:为什么需要重新启动服务器?_Python_Web Hosting - Fatal编程技术网

Python web托管:为什么需要重新启动服务器?

Python web托管:为什么需要重新启动服务器?,python,web-hosting,Python,Web Hosting,目前,我们在服务器上为数百个小型PHP站点运行一个小型共享托管服务。我们也希望提供Python支持,但至少从我们最初的研究来看,每次源代码更改后似乎都需要重新启动服务器 真的是这样吗?如果是这样,我们就无法提供Python托管支持。让我们的客户能够上传文件很容易,但我们不能让他们重新启动(共享)服务器进程 PHP很简单——你上传一个文件的新版本,新版本就会运行 我非常尊重Python语言和社区,因此很难相信更新站点代码真的需要如此疯狂的过程。请告诉我我错了!:-) 取决于部署Python应用程序

目前,我们在服务器上为数百个小型PHP站点运行一个小型共享托管服务。我们也希望提供Python支持,但至少从我们最初的研究来看,每次源代码更改后似乎都需要重新启动服务器

真的是这样吗?如果是这样,我们就无法提供Python托管支持。让我们的客户能够上传文件很容易,但我们不能让他们重新启动(共享)服务器进程

PHP很简单——你上传一个文件的新版本,新版本就会运行


我非常尊重Python语言和社区,因此很难相信更新站点代码真的需要如此疯狂的过程。请告诉我我错了!:-)

取决于部署Python应用程序的方式。如果它是一个纯Python CGI脚本,则无需重新启动(尽管不建议,因为它会非常慢)。如果您在Apache中使用modwsgi,那么有一些有效的方法可以使用。modpython用于模块重新加载

除了Apache之外,还有其他托管Python应用程序的方法,包括CherryPy服务器、粘贴服务器、Zope、Twisted和Tornado


但是,除非您有特定的理由不使用它(因为您可能来自Apache/PHP商店),否则我强烈推荐Apache上的mod_wsgi。我知道Django建议在Apache上使用modwsgi,其他大多数主要Python框架都将在modwsgi上使用;编译后的字节码由Python进程缓存以供以后使用,从而提高性能。默认情况下,将解释PHP。这是可用性和速度之间的折衷

如果您使用的是标准WSGI模块,例如Apache的
mod_WSGI
,那么您不必重新启动服务器——只需触摸
.WSGI
文件,代码就会重新加载。如果您使用的是一些不支持WSGI的怪异服务器,那么您在某种程度上依赖于自己的可用性

真的是这样吗

视情况而定。代码重新加载对于托管解决方案来说是非常特定的。大多数服务器提供了自动重新加载WSGI脚本本身的方法,但没有标准化;事实上,WSGI应用程序对象如何连接到web服务器的问题在不同的托管环境中有很大不同。(您可以制作一个脚本文件,作为CGI、mod_wsgi、passenger和ISAPI_wsgi的部署粘合剂,但这并不是一件小事。)

然而,Python真正要解决的问题是模块重新加载。这对于WSGI应用程序来说是有问题的,因为任何非平凡的webapp都会将其功能封装到模块和包中,而不是简单的独立脚本中。事实证明,重新加载模块是相当棘手的,因为如果你
reload()。理想情况下,未来的方法是在任何文件更新时重新加载整个Python解释器,但实际上一些C扩展似乎不喜欢这样,因此通常不会这样做

需要一次重新加载一组模块,当触及其中一个模块时,这些模块可以可靠地更新应用程序。我使用的部署模块可以做到这一点(我还没有时间发布它,但如果你感兴趣的话可以给你一个副本),它对我自己的Web应用程序非常有用。但是您确实需要一点规范,以确保不会意外地将对旧模块对象的引用留在您不重新加载的其他模块中;如果你说的是大量由第三方编写的站点,它们的代码可能存在漏洞,这可能并不理想

在这种情况下,您可能希望看到类似于在守护进程模式下运行mod_wsgi,为每一方和进程级重新加载一个应用程序组,并在更新任何模块时触摸wsgi脚本文件


你抱怨是对的;这(以及许多其他WSGI部署问题)可能需要一些标准化帮助。

您能否提供此重新启动业务的链接或参考?你在看mod_wsgi吗?在web上运行Python的每一种方法似乎都有服务器重启作为过程的一部分,除了CGI。我的直觉是,这与积极缓存字节码的标准CPython行为有关,但我很想听听能做更多猜测的人的意见……“每种方法?”因为mod_wsgi不是这样工作的,我很好奇你找到了什么方法。你能提供链接或参考资料吗?史蒂文,请不要防备。我在寻求理解,而不是对抗。在谷歌上花点时间会让你相信我的问题是正确的。请看下面的答案,或者写下自己的答案!:-)你明确要求人们告诉你你错了。你是的,他们也是。谢谢你的回答,约翰。您已经给出了一些很好的建议,但并没有真正回答真正的问题:为什么需要重新启动服务器?它们不是用PHP编写的,而是用Python编写的(CGI除外)。我发现这很混乱,因为它们共享相同的基本执行模型,否则…它们不共享相同的基本执行模型。PHP是基于文件的。Apache/mod_php读取一个文件,并在每个请求上对php代码进行交互。与此相反,Python应用程序(取决于部署)通常是长时间运行的进程,即使在没有请求的情况下也会存在。您不需要在apachemod_wsgi下重新启动服务器。只需触摸.wsgi文件,Python进程就会被重新加载。值得注意的是,
mod_wsgi
的“嵌入式”模式除了存在性能和可靠性问题外,还妨碍了代码重新加载的正确操作。我总是在守护程序模式下配置我的服务器,根据我从其他人那里听到的消息,更改为守护程序模式修复了mod_wsgi的许多问题。John,mod_wsgi的嵌入式模式没有性能和可用性