在WSGI应用中生成线程可以吗?

14 投票
2 回答
3831 浏览
提问于 2025-04-16 20:51

为了实现类似于谷歌应用引擎的“延迟调用”(也就是说,先处理请求,然后再处理延迟的任务),我进行了一些实验,最终想出了一个解决方案,就是在一个线程中处理我的延迟调用。

现在我想确认一下,这种做法是否可以接受。

根据WSGI规范,是否有可能在实际请求处理完后,网络服务器就终止进程,而在所有线程还没有执行完之前就结束了?

如果有更好的方法,那也很好。

2 个回答

13

WSGI并没有规定一个应用程序的运行时间(因为WSGI应用程序是一个可以调用的Python对象)。你可以以一种完全不依赖于网络服务器的方式来运行它,这样的话,只有你能控制它的运行时间。

而且WSGI里面也没有任何东西会阻止你创建线程、进程,或者做你想做的任何事情。

7

顺便提一下,你也可以看看:

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

在WSGI规范中,只有在可迭代对象的close()方法中挂钩操作,才能进行延迟工作。这并不是在一个单独的线程中进行,而是在实际请求的上下文中进行,尽管是在响应应该已经发送回客户端之后。因此,你的延迟操作会占用这个请求的线程,直到工作完成为止,这样在此期间这个请求线程就无法处理其他请求了。

一般来说,如果你使用后台线程,不能保证任何托管机制会等到这些后台线程完成后再关闭进程。实际上,我想不出有什么标准的部署机制会这样做。也没有保证在进程关闭时会调用atexit处理程序,这一点在参考文档中也有简要提到。

撰写回答