2

我的堆栈是 Nginx + Flup + Flask。

所以我有一个有限线程,它运行一个具有有限生命周期的后台线程。

t = threading.Thread(target=campaign.run, args=(campaign_obj,))
t.setDaemon(False)
t.start()

它被执行,持续大约一两分钟,然后结束。问题是,为了响应,我让它在后台进程仍在运行时首先向请求返回一个值。

问题是,在某种程度上,fcgi 线程不断被杀死。

我尝试将 connection_timeout 更改为 1800s

    keepalive_timeout 1800s;

重启nginx,现在线程响应后几乎立即被切断。

我怎么能

1)简单地修复我的python代码/fcgi代码(不用redis/rabbitmq/celery重构成一个巨大的新堆栈,因为这真的是一个快速的项目)

2)阻止 nginx 杀死我的线程,至少不会那么快。

谢谢!

4

1 回答 1

0

使用多处理

一旦你返回一个值并完成请求,FastCGI 就会在你之后清理,这意味着你产生的所有线程。如果您真的需要您的任务继续执行,您必须使用多处理,以便您生成的进程可以在请求结束后继续存在。

否则,Celery 真的很容易设置,并且正好解决了你遇到的这个问题......

于 2013-07-26T03:28:48.683 回答