如何使用uwsgi和web.py运行后台函数?
假设我需要在有新评论的时候给自己发一封邮件。
而且我不想让 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(全局解释器锁)是不会被启用的。