Django中的简单线程

时间:2014-11-17 20:04:35

标签: python django multithreading

我需要在Django中实现线程。我需要三个简单的API:

  1. /工作过程= DATA1&安培;作业ID = 1&安培; jobtype = nonasync
  2. /状态
  3. /杀?作业ID = 1
  4. API描述是:

    1. work api将获取process并生成一个处理它的线程。现在,我们可以假设它是一个简单的sleep(10)方法。它将该线程命名为jobid-1。线程应该可以通过此名称检索。如果jobid已存在,则无法创建新线程。 jobtype可以是async,即api调用将在生成线程后立即返回http status code 200。或者它可以是nonasync,以便api等待服务器完成线程并返回结果。
    2. status api应该只显示每个正在运行的进程的状态。
    3. kill api应基于jobid杀死进程。 status api不应该再展示这份工作了。
    4. 这是我的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框架一起工作以及将要处理的边缘情况。

1 个答案:

答案 0 :(得分:1)

正如上面提到的@Daniel Roseman所做的那样 - 由于很多原因,对Django请求/响应周期进行线程处理是个坏主意。

您在这里真正需要的是任务排队。

有一些库使得这类事情变得相当简单 - 我将按照易用性的顺序列出它们(最简单的列表首先列出):

只是我的两分钱。