如何在python中运行后台任务

How to run background tasks in python

提问人:RAM 提问时间:1/22/2020 更新时间:11/21/2022 访问量:32421

问:

我正在使用 Flask 开发一个小型 Web 服务,它需要运行后台任务,最好是从任务队列运行。然而,在谷歌搜索主题之后,唯一的结果基本上是 Celery 和 Redis 队列,它们显然需要单独的排队服务,因此这些选项过于繁重和复杂而无法部署。由于我所寻找的只是一个简单的后台任务队列,它使任务能够在单独的线程/进程上排队和执行,有谁知道 Python 中是否有这样的东西?

python-3.x 多线程

评论

0赞 jordanm 1/22/2020
您希望如何处理队列而不是像 Redis、RabbitMQ 或 SQS 这样的队列系统?
0赞 RAM 1/22/2020
@jordanm 我担心的是,我不应该需要单独的服务,更不用说像 SQS 这样的商业服务了,只是为了在小型 Web 服务中运行后台任务。
2赞 ofirule 1/22/2020
在 python3 中,你有线程池和进程池。也许这对您的用例来说已经足够了。请参见:docs.python.org/3/library/concurrent.futures.html
1赞 jordanm 1/22/2020
我强烈建议不要在烧瓶控制器中使用子进程或线程调用。
1赞 RAM 1/23/2020
@jordanm为什么你不喜欢 Flask 控制器中的线程调用呢?

答:

5赞 user3919706 1/22/2020 #1

asyncio 库可能就是你要找的

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

# Python 3.7+
asyncio.run(main())
10赞 Farhan Syedain 2/3/2021 #2
import threading
import time

class BackgroundTasks(threading.Thread):
    def run(self,*args,**kwargs):
        while True:
            print('Hello')
            time.sleep(1)

t = BackgroundTasks()
t.start()

在 while 语句之后,您可以将要运行的代码放在后台。也许删除一些模型,发送电子邮件或其他什么。

评论

0赞 CalebK 9/18/2023
当我退出程序时,后台任务也会退出。有没有办法防止这种情况发生?
4赞 Prakash Dahal 11/21/2022 #3

如果您使用的是 FastAPI,则已经有 BackgroundTasks 的实现

收到请求后,无需实现线程队列即可执行后台任务。

代码实现:

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

# function that will run in background after sending the response
def write_notification(email: str, message=""):
    with open("log.txt", mode="w") as email_file:
        content = f"notification for {email}: {message}"
        email_file.write(content)


@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Tasks are happening in background"}