我有一个web服务,它运行长时间运行的作业(大约几个小时)。我正在用烧瓶,古尼康,和nginx开发这个。
我想做的是拥有一条需要很长时间才能完成的路径,调用一个创建线程的函数。然后,函数将返回一个guid到路由,路由将返回一个url(使用guid),用户可以使用该url来检查进度。我正在使线程成为守护进程(thread.daemon=True),以便在调用代码(意外)退出时线程退出。
这是正确的使用方法吗?它是有效的,但这并不意味着它是正确的。
my_thread = threading.Thread(target=self._run_audit, args=())
my_thread.daemon = True
my_thread.start()
处理此类问题的更常见方法是从基本应用程序中提取操作并在外部调用它,使用诸如Celery这样的任务管理器系统。
使用this教程,您可以创建任务并从web应用程序触发它。
然后您可以运行:
请记住,您需要单独运行worker:
好吧,虽然你的方法不正确,但基本上它可能会导致你的程序没有可用的线程。如Ali所述,一般的方法是使用像
RQ
或Celery
这样的作业队列。但是,您不需要提取函数来使用这些库。对于烧瓶,我建议您使用Flask-RQ。一开始很简单:RQ公司
记住在你的Flask应用中使用Redis之前先安装它。
只需在烧瓶函数中使用@Job Decorator:
最后,您需要
rqworker
来启动工作进程:有关详细信息,请参见RQ docs。为简单的长时间运行过程而设计的RQ。
芹菜
芹菜更复杂,有大量的功能列表,如果您是新的作业队列和分布式处理方法,则不推荐使用芹菜。
绿叶
绿叶有开关。让您在长时间运行的进程之间切换。 您可以使用greenlet来运行进程。这样做的好处是,您不需要Redis和其他worker,而是必须重新设计功能,使其兼容:
芹菜和RQ对于简单任务来说太过工程化了。 看看这个文档-https://docs.python.org/3/library/concurrent.futures.html
还要检查示例,如何在Flask app-https://stackoverflow.com/a/39008301/5569578的后台运行长时间运行的作业
相关问题 更多 >
编程相关推荐