django 通过thread实现异步任务

2017/7/30 posted in  python

业务场景

业务人员说合作方拿来了几本书的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次。

实现效果