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