当前位置: 首页 > 面试题库 >

如何在Python中在后台运行长时间运行的作业

戚飞虎
2023-03-14
问题内容

我有一个运行长时间运行的作业的Web服务(大约几个小时)。我正在使用Flask,Gunicorn和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的任务管理器系统从基本应用程序中提取操作并在外部调用它。

使用本教程,您可以创建任务并从Web应用程序触发它。

from flask import Flask

app = Flask(__name__)
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)


@celery.task()
def add_together(a, b):
    return a + b

然后,您可以运行:

>>> result = add_together.delay(23, 42)
>>> result.wait()
65

请记住,您需要单独运行worker:

celery -A your_application worker


 类似资料:
  • 问题内容: 我有一个“长期运行的”清理行动,我需要执行我的。做这个的最好方式是什么? 如果我使用a 这样做,我将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。 背景: 我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类方法进行此操作。但是,此方法需要 5秒钟以上 才

  • 问题内容: 我有一个脚本,每5分钟检查一次PC上的内容,并且我不希望Python显示在任务栏上。我使用Windows作为操作系统。 有什么方法可以让Python在后台运行并强制其不在我的任务栏中显示? 问题答案: 在控制面板中查找计划任务。

  • 我对Python和Django相当陌生,所以请让我知道是否有更好的方法来做到这一点。我想做的是拥有每个设备(从模型继承。Model)启动一个长时间运行的后台线程,该线程不断检查该设备的运行状况。然而,当我运行代码时,它似乎不像守护进程那样执行,因为服务器缓慢且不断超时。这个后台线程将(在大多数情况下)运行程序的生命周期。 下面是我代码的简化版本: 这似乎是线程的一个非常简单的用法,但每次我寻找解决

  • 我正在使用rxjava将一些任务上载到服务器,每当任务启动的片段或活动被销毁时,我都会处理订阅以避免内存泄漏,但我想要的是,即使在片段/活动被销毁后,我也需要继续在后台运行任务,有什么方法可以实现这一点吗? 实例 是否必须始终释放订阅?如果不是,何时使用dispose?

  • 问题内容: 有什么方法可以让我的Python脚本(带有无限的“ while”循环)在OS X的后台运行?另外,出于相同的目的,是否可以在USB驱动器上使用“自动运行”的python脚本? 问题答案: 如果要让脚本作为自动启动的守护进程运行,则可以使用launchctl和plist文件。 例如,Bob有一个简单的python脚本,该脚本每秒在其主目录中将单词’foo’写入文件: 要使其作为守护进程运

  • 我有一个压缩图像的任务,它在图像中使用了许多循环: 我在普通线程中运行此方法,如下所示: 或者在后台工作线程中运行 问题是:这种方法有时会出错,在接收无效输入时会导致无限循环。在这种情况下,它将永远运行,并损害CPU,即使当设备的屏幕关闭时,这会增加设备的温度(如果我使用工作线程,它还会阻止等待队列中的其他任务)。 我想我需要设置一个超时来终止长时间运行的任务。在正常Java线程中实现这一点的最佳