我们使用Celery和我们的Django webapp来管理离线任务; 其中一些任务可以运行长达120秒.
每当我们进行任何代码修改时,我们都需要重新启动Celery以重新加载新的Python代码.我们当前的解决方案是将SIGTERM发送到主Celery进程(kill -s 15 `cat /var/run/celeryd.pid`),然后等待它死并重新启动它(python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]).
由于长时间运行的任务,这通常意味着关闭将花费一两分钟,在此期间不会处理任何新任务,从而导致当前站点上的用户显着延迟.我正在寻找一种方法告诉Celery关闭,但随后立即启动一个新的Celery实例来开始运行新任务.
事情并没有工作:
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)立即抱怨并死亡.(这看起来像芹菜本身的一个错误;我让他们知道它.)我试图将.htaccess中的环境变量传递给PHP.这在我的本地WAMP服务器上运行得很好,但在托管我的网站的服务器上,它无故失败.
这是我的测试配置:
的.htaccess:
SetEnv TEST_VARIABLE test_value
Run Code Online (Sandbox Code Playgroud)
test.php的:
<pre>
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?>
getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?>
</pre>
Run Code Online (Sandbox Code Playgroud)
在我的本地服务器上,正确返回test.php:
getenv('TEST_VARIABLE') = test_value
getenv('REDIRECT_TEST_VARIABLE') =
Run Code Online (Sandbox Code Playgroud)
但是在生产服务器上,它返回:
getenv('TEST_VARIABLE') =
getenv('REDIRECT_TEST_VARIABLE') =
Run Code Online (Sandbox Code Playgroud)
我已经排除的事情:
mod_env主机未安装/启用.不能,因为那时候SetEnv不会被识别,我在处理.htaccess时会得到500.
AllowOverrides在httpd.conf这个目录中不包括FileInfo.不可能,因为当遇到SetEnv指令时,Apache会抛出一个错误"SetEnv不允许在这里" ,我会再次获得500.
variables_order在php.ini中不包含'E'.这可以解释$_ENV超全局是空的(它是),但不是为什么getenv()不返回这些变量的值.
整个环境搞砸了.不能,因为getenv('PATH')和getenv('SERVER_NAME')仍然返回有效值.
在这一点上,我不知道是什么配置可能导致这一点.
我有一个Django视图,该视图执行了一些非常繁重的处理,并且大约需要20-30秒才能返回结果。
有时,用户最终会在请求完成之前关闭浏览器窗口(终止连接),在这种情况下,我希望能够检测到这一点并停止工作。我所做的工作在数据库上是只读的,因此事务没有任何问题。
在PHP中,connection_aborted函数正是这样做的。Django提供此功能吗?
这是我要编写的示例代码:
def myview(request):
while not connection_aborted():
# do another bit of work...
if work_complete:
return HttpResponse('results go here')
Run Code Online (Sandbox Code Playgroud)
谢谢。