2013-07-26 59 views
2

我的堆栈是Nginx + Flup + Flask。如何在请求使用nginx/flup重新启动后运行后台线程?

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

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

它被执行,持续大约一分钟或2分钟,然后结束。事情是,为了响应,我已经在后台进程仍在运行时首先向请求返回一个值。

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

我曾试图改变connection_timeout到1800年

keepalive_timeout 1800s; 

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

我怎样才能既

1)简单的解决我的Python代码/ fcgi的代码(不重构与Redis的/ RabbitMQ的一个巨大的新的堆栈/芹菜,因为这实在是一个快速项目)

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

谢谢!

+0

使用子流程。 – snf

+0

子进程或多进程? – nubela

+0

对不起,我的意思是多处理:http://docs.python.org/2/library/multiprocessing.html#the-process-class。 – snf

回答

0

使用多处理

只要你返回一个值,并完成请求,FastCGI的是会照顾你清理,这意味着你催生了线程。如果您确实需要继续执行任务,则必须使用多重处理,以便您生成的过程可以在请求结束时存活。

否则,芹菜真的很容易设置,并解决这个问题,你有...

+0

我不认为子进程工作,除非我写另一个独立的脚本。我同意芹菜。但我认为正确的答案实际上是多进程 – nubela

+0

子进程通过分叉你当前的进程工作。 (AFAIK) – Thomas

+0

你是对的,我混淆了两者。多处理是你需要的。 – Thomas

相关问题