我有一个设置,nginx服务器将控制权传递给uWsgi,后者在我的xml配置文件中使用以下命令启动一个pylons应用程序:
<ini-paste>...</ini-paste>
一切都运行良好,我可以使用相关的ini文件中的以下内容将其设置为调试模式,如:
debug = true
除了调试模式外,只打印出错误,并且每次触摸文件时都不会重新加载代码。如果我直接通过粘贴运行,我可以使用--reload
选项,但通过uWsgi会使事情变得复杂。
有没有人知道如何告诉uWsgi告诉粘贴设置--reload
选项,或者直接在粘贴.ini文件中执行此操作?
答案 0 :(得分:1)
我使用类似下面的代码来解决这个问题,在应用程序初始化时调用monitorFiles(...)方法,它监视文件,在看到更改时发送TERM信号。
我仍然更喜欢使用paster的--reload参数的解决方案,因为我想这个解决方案有错误:
import os
import time
import signal
from deepthought.system import deployment
from multiprocessing.process import Process
def monitorFiles():
if deployment.getDeployment().dev and not FileMonitor.isRunning:
monitor = FileMonitor(os.getpid())
try: monitor.start()
except: print "Something went wrong..."
class FileMonitor(Process):
isRunning = False
def __init__(self, masterPid):
self.updates = {}
self.rootDir = deployment.rootDir() + "/src/python"
self.skip = len(self.rootDir)
self.masterPid = masterPid
FileMonitor.isRunning = True
Process.__init__(self)
def run(self):
while True:
self._loop()
time.sleep(5)
def _loop(self):
for root, _, files in os.walk(self.rootDir):
for file in files:
if file.endswith(".py"):
self._monitorFile(root, file)
def _monitorFile(self, root, file):
mtime = os.path.getmtime("%s/%s" % (root, file))
moduleName = "%s/%s" % (root[self.skip+1:], file[:-3])
moduleName = moduleName.replace("/",".")
if not moduleName in self.updates:
self.updates[moduleName] = mtime
elif self.updates[moduleName] < mtime:
print "Change detected in %s" % moduleName
self._restartWorker()
self.updates[moduleName] = mtime
def _restartWorker(self):
os.kill(self.masterPid, signal.SIGTERM)
答案 1 :(得分:0)
使用0.9.7树中的信号框架
http://projects.unbit.it/uwsgi/wiki/SignalFramework
自动重新加载的一个例子:
import uwsgi
uwsgi.register_signal(1, "", uwsgi.reload)
uwsgi.add_file_monitor(1, 'myfile.py')
def application(env, start_response):
...