2012-01-12 123 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