2013-07-11 26 views
14

我有个问题,那Django可以做多线程吗?Can Django可以做多线程工作吗?

下面是我想要做的:点击网页上的按钮,然后在model.py中有一些函数开始运行,例如,从Internet上抓取一些数据,完成后返回给用户结果。

我不知道,我要开一个新的线程在model.py执行的功能,有谁能够告诉我该怎么办呢?非常感谢你。

+0

什么是你想完成?也许你可以做到这一点的前端TECNOLOGIES如AJAX,WebSocket的,魔术小马... – gipi

+0

什么是魔术小马?在谷歌找不到它... –

回答

9
  1. 是的,它可以多线程,但通常使用芹菜来做等效。 You can read about how in the celery-django tutorial.
  2. 这是罕见的,你实际上要强制用户等待网站。虽然比风险超时更好。

这里是你描述的一个例子。

User sends request 
Django receives => spawns a thread to do something else. 
main thread finishes && other thread finishes 
... (later upon completion of both tasks) 
response is sent to user as a package. 

更好的办法:

User sends request 
Django receives => lets Celery know "hey! do this!" 
main thread finishes 
response is sent to user 
...(later) 
user receives balance of transaction 
+58

芹菜是许多用途的矫枉过正。请停止推荐它作为任何需要不阻止请求/响应的魔术项目。这就像每当有人询问如何存储一行文本时推荐RDBMS一样。 –

+5

@andybak随意建议一个替代方案。对我来说,这听起来像是一种合法用途。 – cwallenpoole

+4

取决于细节,但你可以只产生一个线程和轮询后,您可以使用检查任务的一个简单的cron作业,或者如果你需要更多的功能,你可以用几个“不一样复杂芹菜”一诸如huey或django-background-tasks之类的项目。 –

0

如果你不想一些矫枉过正的框架添加到您的项目中,你可以简单地使用subprocess.Popen

def my_command(request): 
    command = '/my/command/to/run' # Can even be 'python manage.py somecommand' 
    subprocess.Popen(command, shell=True) 
    return HttpResponse(status=204) 
相关问题