Django - Python:派生进程并返回
我已经搜索这个问题有一段时间了,可能是我没有找到正确的信息。
我想把数据发送到一个服务器,然后服务器根据这些数据执行一个Python脚本。我一直在尝试创建一个线程并返回,但我不知道怎么“分离”这个线程。我必须等到线程执行完才能返回一个HttpResponse()。这样不行,因为网站界面上还有很多其他功能需要在这个线程运行的时候也能使用。
我不确定我的解释是否清楚,如果有任何地方让你困惑,我很乐意进一步说明。
3 个回答
使用消息队列系统,比如celery(可以参考一下django-celery)。
使用关系型数据库和后台进程,这些进程可以通过定时任务(cron)定期调用,或者一直在运行。首先,网页服务器会把后台工作需要的数据插入到数据库表中。然后,后台进程(要么一直在运行,要么通过定时任务定期运行)会获取最新插入的数据行并进行处理。
创建一个线程。
worker_thread = threading.Thread(target=do_background_job, args=args)
worker_thread.setDaemon(False)
worker_thread.start()
return HttpResponse()
即使在发送了HttpResponse之后,do_background_job仍然会被处理。不过,由于网页服务器(比如apache)可能会终止任何线程,所以后台工作的执行并不能得到保证。
最简单的方法是使用subprocess.Popen。你可以在这里找到关于subprocess模块的一些信息:
http://docs.python.org/library/subprocess.html
虽然还有其他(可能更好的)方法可以做到这一点,但这个方法似乎符合你的需求。
看看Celery吧。它非常不错,因为你可以快速接受请求,然后把它交给工作者去处理,最后再返回结果。使用起来也很简单。