【问题标题】:Development Mode For uWSGI/Pylons (Reload new code)uWSGI/Pylons 的开发模式(重新加载新代码)
【发布时间】:2012-08-15 02:21:58
【问题描述】:

我有一个设置,这样一个 nginx 服务器将控制权交给 uWsgi,uWsgi 使用我的 xml 配置文件中的以下内容启动一个 pylons 应用程序:

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

一切运行良好,我可以在相关的 ini 文件中使用以下内容将其设置为调试模式,例如:

debug = true

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

有人知道如何告诉 uWsgi 告诉 paste 设置 --reload 选项,还是直接在 paste .ini 文件中执行此操作?

【问题讨论】:

    标签: nginx paste uwsgi


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      在 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):
          ...
      

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 2011-04-30
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多