业务场景
业务人员说合作方拿来了几本书的txt文件,需要导入平台,而且以后会是常态化的工作,需要开发功能来实现。
分析
txt文档中包含大量章节的内容,导入时由于章节比较多,整个过程时间不可控,如果让浏览器同步等待响应结果,很可能会出现响应超时的情况。
所以我们需要通过异步处理的方式来实现,简单看了一下,通过Thread就可以实现这个需求,大致流程如下:
浏览器->服务端: create import task
Note right of 服务端: 检查参数
Note right of 服务端: 在task表中创建任务记录
Note right of 服务端: 启动异步线程
服务端-->浏览器: taskid
Note right of 服务端: 异步线程处理task
浏览器->服务端: get task status
服务端-->浏览器: task status
Demo代码
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
import threading
import datetime
# 执行具体任务的异步线程
class TaskThread(threading.Thread):
def run(self):
import time
for i in range(20):
time.sleep(1)
print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),"%s" % (self.getName(),)
def CreateTask(request):
taskThread = TaskThread()
taskThread.start()
# testThread.join() # 如果加上就会等线程执行完才响应,在我们这个场景下不加
return HttpResponse(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
在上述demo中,访问CreateTask时,浏览器会迅速得到内容为当前时间的反馈,但是后台还会持续执行异步线程,每秒打印一次时间信息,持续20次。