2012-01-12 124 views

回答

8

你可以尝试使用supervisord为您Uwsgi应用经理。它还具有监视功能,可在文件或文件夹“已​​触摸”/修改时自动重新加载进程。

在这里你会找到一个很好的教程:Flask+NginX+Uwsgi+Supervisord

+0

该链接不再可用 – ricosrealm 2017-12-09 01:45:58

-3

恐怕Flask实际上是过于粗暴,因此默认捆绑了这样的实现。

动态重装生产代码通常是一件坏事,但如果你是关心的一个开发环境,看看这个的bash shell脚本http://aplawrence.com/Unixart/watchdir.html

只需更改到任何适合您的需求和替代睡眠间隔echo命令与你用来重新加载uwsgi的任何东西。我运行uwsgi un master模式并发送一个killall uwsgi命令。

5

开发模式Flask的自动重新加载功能实际上是由底层的Werkzeug库提供的。相关的代码在werkzeug/serving.py - 值得一看。但基本上,主应用程序会将WSGI服务器作为一个子进程生成,该进程每秒钟对每个活动的.py文件进行统计,以查找更改。如果它看到任何,子进程退出,并且父进程再次启动它 - 实际上重新加载chages。

没有理由不能在uWSGI层实现类似的技术。如果你不想使用stat循环,你可以尝试使用底层的OS文件监视命令。显然(根据Werkzeug的代码),pyinotify是越野车,但也许Watchdog的作品?尝试一些事情,看看会发生什么。

编辑:

在回应的意见,我认为这将是很容易重新实现。从werkzeug/serving.py建立从你的链接提供的例子,用代码一起:

""" NOTE: _iter_module_files() and check_for_modifications() are both 
    copied from Werkzeug code. Include appropriate attribution if 
    actually used in a project. """ 
import uwsgi 
from uwsgidecorators import timer 

import sys 
import os 

def _iter_module_files(): 
    for module in sys.modules.values(): 
     filename = getattr(module, '__file__', None) 
     if filename: 
      old = None 
      while not os.path.isfile(filename): 
       old = filename 
       filename = os.path.dirname(filename) 
       if filename == old: 
        break 
      else: 
       if filename[-4:] in ('.pyc', '.pyo'): 
        filename = filename[:-1] 
       yield filename 

@timer(3) 
def check_for_modifications(): 
    # Function-static variable... you could make this global, or whatever 
    mtimes = check_for_modifications.mtimes 
    for filename in _iter_module_files(): 
     try: 
      mtime = os.stat(filename).st_mtime 
     except OSError: 
      continue 

     old_time = mtimes.get(filename) 
     if old_time is None: 
      mtimes[filename] = mtime 
      continue 
     elif mtime > old_time: 
      uwsgi.reload() 
      return 

check_for_modifications.mtimes = {} # init static 

这是未经测试,但应该工作。

+0

感谢您的提示!我通过werkzeug.serving看了一下,但希望我能避免弄脏我的手,要求快速解决方案......也许是时候有人实现它了。 :) – Florian 2012-01-15 19:19:14

-1
import gevent.wsgi 
import werkzeug.serving 

@werkzeug.serving.run_with_reloader 
def runServer(): 
    gevent.wsgi.WSGIServer(('', 5000), app).serve_forever() 

(您可以使用任意WSGI服务器)

+3

不幸的是,这不是我的问题的答案。我想让uwsgi去做。 btw:Flask的app.run(debug = True)提供重新加载。 – Florian 2012-01-15 19:21:19

+0

尽管开发。 Web服务器随Flask一起提供重新加载,它还提供了一个用于调试的shell!你不想在生产中给每个人一个python shell! – Jabba 2013-10-06 17:46:44

12

对于开发环境,你可以尝试使用 --python,自动重装uwsgi的参数。 查看源代码,它只能在线程模式下工作(--enable-threads)。

+6

这一个为我工作。将'python-autoreload = 1'添加到我的'uwsgi.ini'文件中就可以重新加载!谢谢! – JoshFinnie 2014-05-13 21:15:59

+1

使用uwsgi皇帝模式 - 这是通过添加到应用程序的ini。谢谢! – 2015-01-30 15:45:57

+1

我认为这是值得一提的是,值'1'和'TRUE'是*不*互换位置。只有'1'适合我。 – kungphu 2016-02-23 07:49:27

37

我正在运行uwsgi 1.9版。5,选择

uwsgi --py-autoreload 1 

的伟大工程

+1

很好的捕获。未列在--help输出中。谢谢! – user237419 2014-04-09 09:47:35

+1

使用uwsgi皇帝模式,既不适用于皇帝进程启动也不适用于单独的应用程序ini配置。前者给出“未知选项”,后者则不予理睬。无论哪种方式,过程必须重新启动,以发现变化... – 2015-01-30 15:43:36

+0

如何运行uwsgi --py-autoreload 1 – Burf2000 2016-11-19 15:50:07

5

如果您正在配置uwsgi与命令参数,通过--py-autoreload=1

uwsgi --py-autoreload=1 

如果您使用的是.ini文件来配置uwsgi和使用uwsgi --ini,以下内容添加到您的.ini文件:

py-autoreload = 1