我正在使用 pylons 和 paste 编写一个 Web 应用程序。在 HTTP 请求完成后,我有一些不想阻止 HTTP 请求的工作(发送一些电子邮件、向数据库写入一些内容等)。
如果我启动一个线程来完成这项工作,可以吗?我总是看到关于粘贴杀死挂起线程等的东西。它会杀死我正在工作的线程吗?
我还能在这里做什么?有没有办法可以让请求返回但在完成后运行一些代码?
谢谢。
您可以使用线程方法(也许设置Thead.daemon属性会有所帮助——但我不确定)。
但是,我建议研究一个任务排队系统。您可以将任务放在队列中(这非常快),然后侦听器可以异步处理任务,从而使 HTTP 请求快速返回。我知道 Django 有两个任务队列:
您还可以考虑使用更“企业级”的消息传递解决方案,例如RabbitMQ或ActiveMQ。
编辑:以前的答案有一些很好的指示。
我认为最好的解决方案是消息系统,因为它可以配置为在 pylons 进程出现故障时不会丢失任务。我总是在线程上使用进程,尤其是在这种情况下。如果您使用的是 python 2.6+,请使用内置的多处理,或者您始终可以安装可以在 pypi 上找到的处理模块(我无法发布链接,因为我是新用户)。
看看 gearman,它是专门为将任务分配给“工人”来处理的。他们甚至可以完全用不同的语言处理它。您可以回来询问任务是否已完成,或者只是让它完成。这应该适用于许多任务。
如果您绝对需要确保它已完成,我建议您在数据库或某个持久化的地方对任务进行排队,然后有一个单独的进程贯穿它,以确保每个进程都得到适当的处理。
要直接回答您的基本问题,您应该能够随心所欲地使用线程。“杀死挂起的线程”部分是粘贴清理自己的线程,而不是你的。
还有其他软件包可能会有所帮助,等等,但我建议你从简单的线程开始,看看你能走多远。只有这样,您才会知道下一步需要什么。
(注意,“Thread.daemon”在这里应该与您几乎无关。设置为 true 将确保您启动的线程不会阻止整个进程退出。但是,这样做意味着如果进程“干净地”退出(而不是被迫退出)即使没有完成工作,您的线程也会被终止。这是否是一个问题,以及您如何处理此类事情,完全取决于您自己的要求和设计。