我需要在Django中实现线程。我需要三个简单的API:
API描述是:
work
api将获取process
并生成一个处理它的线程。现在,我们可以假设它是一个简单的sleep(10)
方法。它将该线程命名为jobid-1
。线程应该可以通过此名称检索。如果jobid已存在,则无法创建新线程。 jobtype
可以是async
,即api调用将在生成线程后立即返回http status code 200
。或者它可以是nonasync
,以便api等待服务器完成线程并返回结果。status
api应该只显示每个正在运行的进程的状态。kill
api应基于jobid
杀死进程。 status
api不应该再展示这份工作了。这是我的Django代码:
processList = []
class Processes(threading.Thread):
""" The work api can instantiate a process object and monitor it completion"""
threadBeginTime = time.time()
def __init__(self, timeout, threadName, jobType):
threading.Thread.__init__(self)
self.totalWaitTime = timeout
self.threadName = threadName
self.jobType = jobtype
def beginThread(self):
self.thread = threading.Thread(target=self.execution,
name = self.threadName)
self.thread.start()
def execution(self):
time.sleep(self.totalWaitTime)
def calculatePercentDone(self):
"""Gets the current percent done for the thread."""
temp = time.time()
secondsDone = float(temp - self.threadBeginTime)
percentDone = float((secondsDone) * 100 / self.totalWaitTime)
return (secondsDone, percentDone)
def killThread(self):
pass
# time.sleep(self.totalWaitTime)
def work(request):
""" Django process initiation view """
data = {}
timeout = int(request.REQUEST.get('process'))
jobid = int(request.REQUEST.get('jobid'))
jobtype = int(request.REQUEST.get('jobtype'))
myProcess = Processes(timeout, jobid, jobtype)
myProcess.beginThread()
processList.append(myProcess)
return render_to_response('work.html',{'data':data}, RequestContext(request))
def status(request):
""" Django process status view """
data = {}
for p in processList:
print p.threadName, p.calculatePercentDone()
return render_to_response('server-status.html',{'data':data}, RequestContext(request))
def kill(request):
""" Django process kill view """
data = {}
jobid = int(request.REQUEST.get('jobid'))
# find jobid in processList and kill it
return render_to_response('server-status.html',{'data':data}, RequestContext(request))
上面的代码中有几个实现问题。线程产生不是以适当的方式完成的。我无法在status
函数中检索进程状态。此外,kill函数仍然实现,因为我无法从其作业ID中获取线程。需要帮助重构。
更新:我这样做是出于学习目的,而不是编写生产代码。因此不会支持任何现成的排队库。这里的目标是理解多线程如何与Web框架一起工作以及将要处理的边缘情况。
答案 0 :(得分:1)
正如上面提到的@Daniel Roseman所做的那样 - 由于很多原因,对Django请求/响应周期进行线程处理是个坏主意。
您在这里真正需要的是任务排队。
有一些库使得这类事情变得相当简单 - 我将按照易用性的顺序列出它们(最简单的列表首先列出):
只是我的两分钱。