gpt4 book ai didi

python - Django 中的简单线程

转载 作者:行者123 更新时间:2023-11-28 18:40:24 25 4
gpt4 key购买 nike

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

  1. /work?process=data1&jobid=1&jobtype=nonasync
  2. /状态
  3. /kill?jobid=1

API 描述是:

  1. work api 将接收一个process 并生成一个线程来处理它。现在,我们可以假设它是一个简单的 sleep(10) 方法。它将线程命名为 jobid-1。该线程应该可以通过该名称检索。如果 jobid 已经存在,则无法创建新线程。 jobtype 可以是 async 即,api 调用将在生成线程后立即返回 http 状态代码 200。或者它可以是 nonasync,这样 api 就会等待服务器完成线程并返回结果。
  2. status api 应该只显示每个正在运行的进程的状态。
  3. 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 框架一起工作,以及需要处理哪些边缘情况。

最佳答案

正如@Daniel Roseman 上面提到的——出于多种原因,在 Django 请求/响应周期内执行线程是一个非常糟糕的主意。

您在这里实际寻找的是任务队列。

有一些库可以使这类事情变得相当简单——我将按照易用性的顺序在下面列出它们(最简单的列在最前面):

只是我的两分钱。

关于python - Django 中的简单线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com