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

2024-04-24 08:10:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我正在为每个订阅的用户创建一个芹菜工人。我让特定的芹菜工人睡觉,直到下一个事件,在这一点上它恢复并发出消息。你知道吗

像这样:

    nextEventDelay = events.getTimeToNextEventInSeconds()

    sleep(nextEventDelay)

    SendEventNotification()

但我知道,这不好。对于一个人/2个人来说,这是有效的。但是对于1000个用户来说,如果它产生了1000个工人,那就不好了。你知道吗

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

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


Tags: 数据用户服务器数据库应用程序消息列表时间
1条回答
网友
1楼 · 发布于 2024-04-24 08:10:39

使用celery beats,您可以每x秒运行一次作业,以检查在启动后的两分钟内是否有任何事件。然后,您可以从该任务触发“提醒”作业。你知道吗

这是定期芹菜任务的文档。 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

我建议你远离长时间的芹菜任务,因为我对它们没有很好的经验。你知道吗

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

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

相关问题 更多 >