Python 冗长的例行公事
我必须在我的烧瓶应用程序中做一些长时间的工作。我想异步完成。只需开始工作,然后从javascript检查状态 我试着做一些类似的事情:Python 冗长的例行公事,python,flask,gunicorn,long-running-processes,Python,Flask,Gunicorn,Long Running Processes,我必须在我的烧瓶应用程序中做一些长时间的工作。我想异步完成。只需开始工作,然后从javascript检查状态 我试着做一些类似的事情: @app.route('/sync') def sync(): p = Process(target=routine, args=('abc',)) p.start() return "Working..." 但这也造就了已经不复存在的gunicorn工人 怎么解决呢??我应该用芹菜吗?有很多选择。您可以开发自己的解决方案,使用芹菜或
@app.route('/sync')
def sync():
p = Process(target=routine, args=('abc',))
p.start()
return "Working..."
但这也造就了已经不复存在的gunicorn工人
怎么解决呢??我应该用芹菜吗?有很多选择。您可以开发自己的解决方案,使用芹菜或扭曲的我相信有更多已经作出的选择,但这些是最常见的 开发内部解决方案并不困难。您可以使用Python标准库的多处理模块: 当任务到达时,在数据库中插入一行,其中包含任务id和状态。 然后启动一个流程来执行在完成时更新行状态的工作。 您可以使用一个视图来检查任务是否已完成,这实际上只是检查相应任务中的状态。 当然,您必须考虑将计算结果存储在何处,以及出现错误时会发生什么 配芹菜也很容易。它将如下所示。 要定义要异步执行的函数,请执行以下操作:
@celery.task
def mytask(data):
... do a lot of work ...
然后,使用延迟方法,而不是直接调用任务(如mytaskdata),直接执行任务:
最后,您可以使用ready检查结果是否可用:
但是,请记住,要使用芹菜,必须运行外部辅助进程
我从来没有看过Twisted,所以我不能告诉你它是否比这个复杂,但做你想做的也应该没问题
在任何情况下,这些溶液中的任何一种都应与烧瓶配合使用。为了检查结果,如果您使用Javascript,这一点都不重要。只需创建检查状态返回JSON的视图,就可以使用Flask的jsonify 我会使用诸如rabbitmq或activemq之类的消息代理。flask进程将向消息队列添加作业,长时间运行的工作进程或池或工作进程将从队列中删除作业以完成它们。工作进程可以更新数据库,以允许flask服务器了解作业的当前状态,并将此信息传递给客户端
使用芹菜似乎是一种很好的方法。好吧,我真的有你说的所有关于将结果存储在DB中的内容。实现我自己的解决方案的主要问题是,当我使用多处理时,它会导致gunicorn worker失效。看起来您的问题是父进程在return语句之后终止,这实际上会终止您刚刚创建的子进程。为了避免这种情况,您只需在父级退出之前对子级进行后台监控,即分离它i get ValueError:将关闭的文件与多处理一起使用时对其执行i/O操作。看来我需要用波本。设置Process.daemon=True也没有帮助。是的,根据p.daemon=True是不够的。如果您使用的是*nix平台,我会使用它来直接调用fork,而不是多处理或Popen。如果你在Windows中,你必须创建一个服务而不是守护进程。在任何情况下,最可移植的解决方案可以是使用芹菜或Twisted。您能否分享一个创建长时间运行的工作进程以从队列中读取的示例
result = mytask.delay(mydata)
result.ready()