如何使用uwsgi和web.py运行后台函数?

3 投票
1 回答
1061 浏览
提问于 2025-04-17 18:29

假设我需要在有新评论的时候给自己发一封邮件。
而且我不想让 web.py 在向浏览器展示 HTML 的时候被阻塞。
而且在这里使用线程似乎也不太管用。

class comment:
    def POST(self):
       ...
       sender = Thread(target=_sendmail,args=('New Comment',msg))
       sender.start()
       referer = web.ctx.get('HTTP_REFERER', 'http://www.domain.com')
       raise web.SeeOther(referer)

使用线程的问题在于,一旦 POST 函数完成,里面的发送器就会被“冻结”,通常发送器没有完成它的工作。
我当然不想用 sender.join() 来等待发送器结束。

我觉得 uwsgi 和这个没什么关系。
但我看到有个解释说,当没有请求或者请求完成时,uwsgi 会暂停 web.py 应用。
web.py 提供了一种叫 @background 的方法,http://webpy.org/cookbook/background
但这似乎有一些问题,它不会清理 threaddb 字典。
而且它会在 URL 后面加一个参数,比如 http://domain.com:8080/?_t=3080772748,看起来很难看。
有没有更好的解决方案? 就是在正常处理 URL 请求的同时发送邮件。

1 个回答

3

在uWSGI中使用线程是没有问题的,但要记得用--enable-threads这个选项来开启它。否则,由于性能原因,GIL(全局解释器锁)是不会被启用的。

撰写回答