Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我耗时任务的单独流程(烧瓶应用程序)_Python_Flask - Fatal编程技术网

Python 我耗时任务的单独流程(烧瓶应用程序)

Python 我耗时任务的单独流程(烧瓶应用程序),python,flask,Python,Flask,我遇到了一个类似于中的问题。我有一个flask应用程序,它从用户那里获取输入(有时是数千个地址),然后对其进行处理(清理/地理编码),然后在完成所有操作后返回结果页。在此期间,页面将保持加载状态。根据输入的大小,此加载时间可能长达15分钟。该应用程序每分钟可以处理大约300个地址 我看到其中一个答案说,可以通过将所有工作放在一个单独的进程上,并将用户重定向到“加载请等待”页面,然后在完成后,将用户重定向到结果页面来解决这个问题 我想知道这一切都意味着什么 这是我的代码的简化版本,不包括导入语句等

我遇到了一个类似于中的问题。我有一个flask应用程序,它从用户那里获取输入(有时是数千个地址),然后对其进行处理(清理/地理编码),然后在完成所有操作后返回结果页。在此期间,页面将保持加载状态。根据输入的大小,此加载时间可能长达15分钟。该应用程序每分钟可以处理大约300个地址

我看到其中一个答案说,可以通过将所有工作放在一个单独的进程上,并将用户重定向到“加载请等待”页面,然后在完成后,将用户重定向到结果页面来解决这个问题

我想知道这一切都意味着什么

这是我的代码的简化版本,不包括导入语句等:(我目前正在使用gunicorn为应用程序提供服务)

在应用程序完成运行后,出现以下控制台错误:

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)