Python 我耗时任务的单独流程(烧瓶应用程序)
我遇到了一个类似于中的问题。我有一个flask应用程序,它从用户那里获取输入(有时是数千个地址),然后对其进行处理(清理/地理编码),然后在完成所有操作后返回结果页。在此期间,页面将保持加载状态。根据输入的大小,此加载时间可能长达15分钟。该应用程序每分钟可以处理大约300个地址 我看到其中一个答案说,可以通过将所有工作放在一个单独的进程上,并将用户重定向到“加载请等待”页面,然后在完成后,将用户重定向到结果页面来解决这个问题 我想知道这一切都意味着什么 这是我的代码的简化版本,不包括导入语句等:(我目前正在使用gunicorn为应用程序提供服务) 在应用程序完成运行后,出现以下控制台错误:Python 我耗时任务的单独流程(烧瓶应用程序),python,flask,Python,Flask,我遇到了一个类似于中的问题。我有一个flask应用程序,它从用户那里获取输入(有时是数千个地址),然后对其进行处理(清理/地理编码),然后在完成所有操作后返回结果页。在此期间,页面将保持加载状态。根据输入的大小,此加载时间可能长达15分钟。该应用程序每分钟可以处理大约300个地址 我看到其中一个答案说,可以通过将所有工作放在一个单独的进程上,并将用户重定向到“加载请等待”页面,然后在完成后,将用户重定向到结果页面来解决这个问题 我想知道这一切都意味着什么 这是我的代码的简化版本,不包括导入语句等
Traceback (most recent call last):
File "/home/my name/anaconda/lib/python2.7/SocketServer.py", line 596, in process_request_thread
self.finish_request(request, client_address)
File "/home/my name/anaconda/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/my name/anaconda/lib/python2.7/SocketServer.py", line 654, in __init__
self.finish()
File "/home/my name/anaconda/lib/python2.7/SocketServer.py", line 713, in finish
self.wfile.close()
File "/home/my name/anaconda/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/home/my name/anaconda/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
使用芹菜略去了一点——它可以让你启动一个后台进程,但不能帮助你解决事情超时的问题!我推荐的解决方案是使用redis或您的数据库来存储结果。。。当有人访问“启动此工作”url时,他们会收到一条消息“开始流程,请在15分钟左右检查“/results”,并将数据库中的标志设置为“in work” 芹菜过程开始并将结果存储在数据库的某个位置。完成后,它会将标志设置为“完成”
当某人转到
/results
时,如果标志设置为“已完成”,他们会从数据库中获取结果;如果标志设置为“正在工作”,则会显示消息“仍在工作”。您没有在后台运行任务。使用delay
或apply_async
在后台运行任务。直接调用它会同步执行它
task = cleanAddress.delay(address)
return jsonify(task.id)
使用任务的id进行响应,然后使用单独的视图轮询其状态,以确定结果是否准备就绪
from celery.states import SUCCESS
task = cleanAddress.AsyncResult(id)
return jsonify(task.state == SUCCESS)
存储状态(和结果)需要配置代理和结果后端。默认情况下,没有配置结果后端,因此所有状态都被丢弃。除了您所描述的方式之外,还有其他方式防止超时吗?如果您有任务id的句柄,则为True。如果你想把它设置好,这样你就可以离开,然后再回来,你必须把任务id存储在某个地方。。。无论是在响应页面(进行轮询)的html中,还是在数据库条目中,或者其他任何内容中。我并不是说芹菜不是解决方案——只是启动芹菜任务并不是全部答案——你还需要考虑如何将任务的结果反馈给用户。
task = cleanAddress.delay(address)
return jsonify(task.id)
from celery.states import SUCCESS
task = cleanAddress.AsyncResult(id)
return jsonify(task.state == SUCCESS)