我有一个设置,使NGINX服务器将控件传递给UWSGI,该控制器使用我的XML配置文件中的以下内容启动了一个塔架应用程序:

<ini-paste>...</ini-paste>

一切都很好地工作,我能够使用关联INI文件中的以下内容将其设置为调试模式,例如:

debug = true

除了调试模式仅打印出错误,并且每次触摸文件时都不会重新加载代码。如果我直接通过糊剂运行,我可以使用 --reload 选项,但是通过UWSGI使事情变得复杂。

是否有人知道一种告诉UWSGI告诉Paste设置的方法 --reload 选项,还是直接在粘贴.ini文件中执行此操作?

有帮助吗?

解决方案

我使用以下代码来解决此问题,在应用程序初始化时调用MonitorFiles(...)方法,并监视文件,在看到更改时发送术语信号。

我仍然更喜欢使用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)

其他提示

在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):
    ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top