1

我正在使用 pylons 和 paste 编写一个 Web 应用程序。在 HTTP 请求完成后,我有一些不想阻止 HTTP 请求的工作(发送一些电子邮件、向数据库写入一些内容等)。

如果我启动一个线程来完成这项工作,可以吗?我总是看到关于粘贴杀死挂起线程等的东西。它会杀死我正在工作的线程吗?

我还能在这里做什么?有没有办法可以让请求返回但在完成后运行一些代码?

谢谢。

4

4 回答 4

0

您可以使用线程方法(也许设置Thead.daemon属性会有所帮助——但我不确定)。

但是,我建议研究一个任务排队系统。您可以将任务放在队列中(这非常快),然后侦听器可以异步处理任务,从而使 HTTP 请求快速返回。我知道 Django 有两个任务队列:

您还可以考虑使用更“企业级”的消息传递解决方案,例如RabbitMQActiveMQ

编辑以前的答案有一些很好的指示。

于 2009-10-22T00:28:54.713 回答
0

我认为最好的解决方案是消息系统,因为它可以配置为在 pylons 进程出现故障时不会丢失任务。我总是在线程上使用进程,尤其是在这种情况下。如果您使用的是 python 2.6+,请使用内置的多处理,或者您始终可以安装可以在 pypi 上找到的处理模块(我无法发布链接,因为我是新用户)。

于 2009-10-28T19:19:36.150 回答
0

看看 gearman,它是专门为将任务分配给“工人”来处理的。他们甚至可以完全用不同的语言处理它。您可以回来询问任务是否已完成,或者只是让它完成。这应该适用于许多任务。

如果您绝对需要确保它已完成,我建议您在数据库或某个持久化的地方对任务进行排队,然后有一个单独的进程贯穿它,以确保每个进程都得到适当的处理。

于 2009-11-20T04:10:49.160 回答
0

要直接回答您的基本问题,您应该能够随心所欲地使用线程。“杀死挂起的线程”部分是粘贴清理自己的线程,而不是你的。

还有其他软件包可能会有所帮助,等等,但我建议你从简单的线程开始,看看你能走多远。只有这样,您才会知道下一步需要什么。

(注意,“Thread.daemon”在这里应该与您几乎无关。设置为 true 将确保您启动的线程不会阻止整个进程退出。但是,这样做意味着如果进程“干净地”退出(而不是被迫退出)即使没有完成工作,您的线程也会被终止。这是否是一个问题,以及您如何处理此类事情,完全取决于您自己的要求和设计。

于 2009-12-03T22:36:41.727 回答