Rob*_*ert 26 django multithreading
我有一个问题,Django可以做多线程的工作吗?
这就是我想要做的:点击网页上的一个按钮,然后在model.py中有一些功能开始运行,例如,从互联网抓取一些数据,完成后,它会返回给用户结果.
我想我必须打开一个新的线程来执行model.py中的函数,有人能告诉我怎么做吗?非常感谢你.
cwa*_*ole 16
这是你所描述的一个例子.
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.
Run Code Online (Sandbox Code Playgroud)
更好的方法:
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
Run Code Online (Sandbox Code Playgroud)
如该答案所示,您可以使用线程包执行异步任务。每个人似乎都推荐Celery,但是对于执行简单但长期运行的任务来说,这通常是多余的。我认为使用线程实际上更容易,更透明。
这是一个异步搜寻器的简单示例:
#views.py
import threading
from .models import Crawl
def startCrawl(request):
task = Crawl()
task.save()
t = threading.Thread(target=doCrawl,args=[task.id])
t.setDaemon(True)
t.start()
return JsonResponse({'id':task.id})
def checkCrawl(request,id):
task = Crawl.objects.get(pk=id)
return JsonResponse({'is_done':task.is_done, result:task.result})
def doCrawl(id):
task = Crawl.objects.get(pk=id)
# Do crawling, etc.
task.result = result
task.is_done = True
task.save()
Run Code Online (Sandbox Code Playgroud)
您的前端可以发出startTask启动爬网的请求,也可以发出Ajax请求以对其进行检查,checkCrawl并在完成后返回true和结果。
| 归档时间: |
|
| 查看次数: |
40700 次 |
| 最近记录: |