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

时间:2017-07-11 00:31:32

标签: python events asynchronous celery

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

现在我正在为每个订阅的用户创建一个芹菜工人。我让特定的芹菜工人睡到下一个事件,然后它恢复并发出消息。

这样的事情:

    nextEventDelay = events.getTimeToNextEventInSeconds()

    sleep(nextEventDelay)

    SendEventNotification()

但我知道,这不好。对于一个人/两个人来说,它正在发挥作用。但是对于1000个用户来说,如果它产生了1000个工人,那就不会好了。

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

我正在使用Celery与redis进行异步任务管理。应用程序是Python烧瓶应用程序。如果您需要更多信息,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

使用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