如何在Django中添加简单的延迟任务?

时间:2016-05-24 07:43:20

标签: django multithreading celery chatbot

我正在创建一个聊天机器人,需要一个解决方案,以便在特定延迟后将来向用户发送消息。我的系统设置了Nginx,Gunicorn和Django。这个想法是,如果机器人需要向用户发送几条消息,它可以将每个后续消息延迟一定时间,然后再将其发送给“人类”。

但是,简单的threading.Timer方法不起作用,因为用户可能会在任何时刻中断此过程,提示将来的消息被更改,但是计时器线程可能无法停止,因为它们位于不同的工人。到目前为止,我遇到了两个解决方案:

  1. 盲目地使用threading.Timer来检查数据库中的发送列表,可能会产生许多不需要的线程的问题。还使数据库不那么干净/有条理。
  2. 使用芹菜或其他系统执行这些未来的任务。似乎过度杀戮和过度设计一个简单的问题。任务总是只是延迟函数调用。处理哪些消息属于哪个对话也很麻烦。
  3. 这个问题的最佳解决方案是什么?

    另外,一个更通用的问题:

    理想情况下,最好的解决方案是一个框架,我可以为每个对话“模拟”一个新的机器人,因此它充当自己的实体,并将所有状态/消息队列信息保存在内存中。当需要基于预设延迟或传入消息执行某些操作时,此框架仅需要将资源分配给机器人。有没有像这样存在的东西?

1 个答案:

答案 0 :(得分:1)

就我个人而言,我会使用芹菜;执行延迟函数调用是它的工作。而且我不知道为什么知道什么消息属于哪里会比在一个线程中做更多的问题。

但您可能还想调查Andrew Godwin正在做的新Django-Channels工作,因为这是为了支持异步后台任务。

相关问题