到目前为止,我已经按照以下建议重新加载了代码:

https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki

这样做的缺点是,每N秒仅检测一次代码更改。我可以使用N = 0.1,但这会导致无用的磁盘IO。

AFAIK可以通过python获得Linux内核的inotify回调。

有没有更快的方法来检测代码更改并重新启动wsgi处理程序?

我们在Linux上使用守护程序模式。

为什么根本要为mod_wsgi重新加载代码

我完全想要这个,这引起了我的兴趣。这是我的设置:

大多数人使用“manage.py runserver”进行开发,并使用其他wsgi部署进行生产。

在我的上下文中,我们已经自动创建了新系统,产品和开发系统几乎完全相同。

一个操作系统(linux)可以承载N个系统(虚拟环境)。

开发人员可以使用runserver或mod_wsgi。使用runserver的好处是易于调试,而mod_wsgi的好处是您不需要先启动服务器。

mod_wsgi的好处是您知道URL:https://dev-server/system-name/myurl/
使用runserver,您不知道端口。用例:您想从内部Wiki链接到开发系统...。

一个肮脏的hack,用于重新加载mod_wsgi的代码,这是我们过去使用的:maximum-requests=1,但这很慢。

最佳答案

预备赛。



但是,您确实需要首先设置服务器,这需要很多工作。服务器也需要在此处启动,尽管您可以将其配置为在引导时自动启动。

如果通常在端口80或443上运行,则只能由root用户启动服务器。如果需要重新启动,则必须再次询问 super 用户的帮助。因此,./manage.py runserver在这里得分很高。



这与开发服务器没有什么不同。默认情况下,它从端口8000开始,因此您可以作为http://dev-server:8000/system-name/myurl/访问它。如果要在开发服务器上使用SSL,则可以使用django-sslserver之类的软件包,也可以将nginx放在django开发服务器的前面。



使用runserver,端口已如上文所述进行了很好的定义。您可以使用以下命令使它在其他端口上监听:

 ./manage.py runserver 0.0.0.0:9090

请注意,如果将开发服务器放在apache(作为反向代理)或NGINX后面,则上面提到的重启问题等不适用于此处。

简而言之,对于开发工作,可以使用django开发服务器(也称为./manage.py runserver)完成对mod_wsgi的处理。

变声

在这里,我们终于到了主要话题。假设您已经安装了inotify-tools,则可以在shell中键入它。您无需编写脚本。
  while inotifywait -r -e modify .; do sudo kill -2 yourpid ; done

这将导致在以下情况下重新加载代码:



或者
while inotifywait -r -e modify .; do touch wsgi.py ; done

什么时候



在这两种情况下,我们都使用-r标志告诉inotify监视子目录。这意味着每次保存.css.js文件时,apache都会重新加载。但是如果没有-r标志,将不会检测到子文件夹中python代码的更改。为了兼顾两者的优点,请使用--exclude指令删除css,js,images等。

当您的IDE保存自动备份文件时,该怎么办?或vim保存.swp文件?那也将导致代码重载。因此,您也必须排除那些文件类型。

简而言之,要重现django开发服务器的功能是很费劲的。

10-06 04:05