gpt4 book ai didi

python - 如何从尽可能快地运行的 CherryPy BackgroundTask 返回数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:48 24 4
gpt4 key购买 nike

我正在构建一个 Web 服务,用于使用 CherryPy 对数据进行迭代批处理。理想的工作流程如下:

  1. 用户将数据发布到服务进行处理
  2. 当处理作业空闲时,它收集排队的数据并开始另一个迭代
  3. 在处理作业时,用户正在将更多数据发送到队列以进行下一次迭代
  4. 当前迭代完成后,结果将传回,以便用户可以使用相同的 API 获取它们。
  5. 作业从下一批排队数据重新开始。

这里的关键考虑因素是处理应该尽可能快地运行,每次迭代在前一个迭代完成后立即开始,而不管队列中的数据量是多少。每次迭代需要多长时间没有上限,因此我无法为其运行创建固定的时间表。

有几个使用 BackgroundTask ( like this one ) 的例子,但我还没有找到一个处理返回数据的例子,或者一个处理尽可能快运行的任务的例子以固定的时间表。

我并不拘泥于 BackgroundTask 解决方案,所以如果有人可以提供替代方案,我将非常高兴。不过感觉框架内有解决方案。

最佳答案

不要使用 BackgroundTask 解决方案运行后台任务,因为它将在线程中运行,并且由于 GIL , cherrypy 将无法回答新的请求。使用在不同进程中运行后台任务的队列解决方案,例如 CeleryRQ .

我将详细开发一个使用 RQ 的示例。 RQ 使用 Redis 作为消息代理,因此首先需要安装并启动 Redis。

然后用长时间运行的后台方法创建一个模块(在我的例子中是mytask):

import time
def long_running_task(value):
time.sleep(15)
return len(value)

启动一个(如果您想并行运行任务,则启动多个)RQ worker,运行您的 worker 的 python 必须能够访问您的 mytask 模块(之前导出 PYTHONPATH如果您的模块不在路径中,则运行 worker:

# rq worker

上面有一个非常简单的 cherrypy webapp,它展示了如何使用 RQ 队列:

import cherrypy
from redis import Redis
from rq import Queue
from mytask import long_running_task


class BackgroundTasksWeb(object):

def __init__(self):
self.queue = Queue(connection=Redis())
self.jobs = []

@cherrypy.expose
def index(self):
html = ['<html>', '<body>']
html += ['<form action="job">', '<input name="q" type="text" />', '<input type="submit" />', "</form>"]
html += ['<iframe width="100%" src="/results" />']
html += ['</body>', '</html>']
return '\n'.join(html)

@cherrypy.expose
def results(self):
html = ['<html>', '<head>', '<meta http-equiv="refresh" content="2" >', '</head>', '<body>']
html += ['<ul>']
html += ['<li>job:{} status:{} result:{} input:{}</li>'.format(j.get_id(), j.get_status(), j.result, j.args[0]) for j in self.jobs]
html += ['</ul>']
html += ['</body>', '</html>']
return '\n'.join(html)

@cherrypy.expose
def job(self, q):
job = self.queue.enqueue(long_running_task, q)
self.jobs.append(job)
raise cherrypy.HTTPRedirect("/")


cherrypy.quickstart(BackgroundTasksWeb())

在生产网络应用程序中,我会使用 jinja2 模板引擎生成 html,并且很可能使用 websockets 来更新网络浏览器中的作业状态。

关于python - 如何从尽可能快地运行的 CherryPy BackgroundTask 返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644974/

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