在Python Paste中启动自己的线程
我正在用pylons和paste写一个网页应用。我有一些工作想在HTTP请求完成后做,比如发送邮件、写东西到数据库等等,但我不想让这些工作阻塞HTTP请求。
如果我开一个线程来做这些工作,这样可以吗?我总是看到关于paste会杀掉挂起线程的说法。那它会杀掉我正在做工作的线程吗?
还有什么其他方法可以做到这一点?有没有办法让我请求返回后,再执行一些代码?
谢谢。
4 个回答
0
看看gearman吧,它是专门用来把任务分配给“工作者”来处理的。工作者甚至可以用完全不同的编程语言来完成这些任务。你可以回来询问任务是否完成,或者就让它自己完成。这样对于很多任务来说都很有效。
如果你一定要确保任务已经完成,我建议把任务放到数据库或者其他持久化的地方排队,然后再用一个单独的程序来处理这些任务,确保每一个都被妥善处理。
0
我觉得最好的解决办法是使用消息系统,因为它可以设置成在处理任务的程序崩溃时不会丢失任务。我总是会选择使用进程而不是线程,尤其是在这种情况下。如果你使用的是Python 2.6及以上版本,可以使用内置的multiprocessing模块,或者你也可以去pypi上安装处理模块(我不能发链接,因为我是新用户)。
0
你可以考虑使用线程的方法(也许设置一下Thread.daemon属性会有帮助——不过我不太确定)。
不过,我建议你可以看看任务队列系统。你可以把一个任务放到队列里(这个过程非常快),然后一个监听器可以异步处理这些任务,这样HTTP请求就能快速返回。对于Django,我知道有两个任务队列:
你也可以考虑使用一些更“企业级”的消息解决方案,比如RabbitMQ或者ActiveMQ。
编辑:之前的回答里有一些不错的建议。