Python 这是运行长时间运行的异步任务的正确方法吗?

Python 这是运行长时间运行的异步任务的正确方法吗?,python,events,asynchronous,celery,Python,Events,Asynchronous,Celery,我试图为事件列表提供一个通知服务,数据库中每隔几分钟就有可用的数据,并使用某种机制进行更新。在下一个活动开始前2分钟,我需要读取此数据库并将数据发送给我的订阅者,以提醒活动即将开始。这个时间不是固定的。它们取决于下一个事件的事件时间 现在我正在为每个订阅的用户创建一个芹菜工人。我让特定的芹菜工人进入睡眠状态,直到下一个事件发生,此时它恢复并发出消息 大概是这样的: nextEventDelay = events.getTimeToNextEventInSeconds() sle

我试图为事件列表提供一个通知服务,数据库中每隔几分钟就有可用的数据,并使用某种机制进行更新。在下一个活动开始前2分钟,我需要读取此数据库并将数据发送给我的订阅者,以提醒活动即将开始。这个时间不是固定的。它们取决于下一个事件的事件时间

现在我正在为每个订阅的用户创建一个芹菜工人。我让特定的芹菜工人进入睡眠状态,直到下一个事件发生,此时它恢复并发出消息

大概是这样的:

    nextEventDelay = events.getTimeToNextEventInSeconds()

    sleep(nextEventDelay)

    SendEventNotification()
但我知道,这不好。对于一个人/2个人来说,这是可行的。但是对于1000个用户来说,如果它产生了1000个工人,那就不好了

那么我的解决方案呢?我正在考虑创建一个工作进程,它将监视数据库中的订阅者,一旦发出通知,它将从数据库中读取并发送给订阅者但是,这只处理一个事件。我是否应该将其保存在无限循环中,以便通知下一个事件?


我使用芹菜与redis进行异步任务管理。应用程序是Python flask应用程序。如果你需要更多信息,请告诉我。谢谢。

使用芹菜节拍,您可以每x秒运行一次作业,以检查启动后两分钟内是否有任何事件。然后,您可以从该任务触发“提醒”作业

以下是定期芹菜任务的文档。

我建议你远离长时间运行的芹菜任务,因为我没有很好的经验

下面是一些未经测试的伪代码,让您开始使用

from celery import Celery
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # check for events every 20 seconds

    sender.add_periodic_task(20.0, trigger_reminders.s(), name='check for upcoming events')

@app.task
def trigger_reminders(*args, **kwargs):
    upcoming_events = get_upcoming_events()
    for event in upcoming_events:
        send_notification.delay(event)

@app.task
def send_event(*args, **kwargs):
    #Send the user notification