小编nit*_*wit的帖子

如何在不延迟任务的情况下优雅地重新启动Celery

我们使用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实例来开始运行新任务.

事情并没有工作:

  • 将SIGHUP发送到主进程:这导致Celery尝试通过执行热关闭然后重新启动来"重启".这不仅需要很长时间,甚至还不起作用,因为显然新工艺在旧工艺死亡之前启动,因此新工艺会ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)立即抱怨并死亡.(这看起来像芹菜本身的一个错误;我让他们知道它.)
  • 将SIGTERM发送到主进程,然后立即启动新实例:与Pidfile相同的问题.
  • 完全禁用Pid文件:如果没有它,我们无法告诉30个Celery进程中哪一个是我们希望它进行热关闭时需要发送SIGTERM的主要进程.我们也没有可靠的方法来检查主要过程是否仍然存在.

linux django pid celery celeryd

24
推荐指数
2
解决办法
1万
查看次数

环境变量不会从.htaccess传递给PHP

我试图将.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)

我已经排除的事情:

  1. mod_env主机未安装/启用.不能,因为那时候SetEnv不会被识别,我在处理.htaccess时会得到500.

  2. AllowOverrideshttpd.conf这个目录中不包括FileInfo.不可能,因为当遇到SetEnv指令时,Apache会抛出一个错误"SetEnv不允许在这里" ,我会再次获得500.

  3. variables_order在php.ini中不包含'E'.这可以解释$_ENV超全局是空的(它是),但不是为什么getenv()不返回这些变量的值.

  4. 整个环境搞砸了.不能,因为getenv('PATH')getenv('SERVER_NAME')仍然返回有效值.

在这一点上,我不知道是什么配置可能导致这一点.

php apache cgi environment-variables

10
推荐指数
2
解决办法
1万
查看次数

如何在Django中检测连接中断?

我有一个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)

谢谢。

apache django wsgi http

5
推荐指数
1
解决办法
1408
查看次数

标签 统计

apache ×2

django ×2

celery ×1

celeryd ×1

cgi ×1

environment-variables ×1

http ×1

linux ×1

php ×1

pid ×1

wsgi ×1