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

How do I add simple delayed tasks in Django?

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

但是,简单的 threading.Timer 方法将不起作用,因为用户可能会随时中断此过程以提示更改未来的消息,但计时器线程可能无法按原样停止在不同的工人身上。到目前为止,我遇到了两种解决方案:

  1. 盲目地使用 threading.Timer 来检查数据库中的待发送列表,可能会产生大量不需要的线程的问题。也使数据库更少 clean/organized.
  2. 使用 celery 或其他系统来执行这些未来的任务。似乎矫枉过正和过度设计一个简单的问题。任务将永远只是延迟的函数调用。处理哪些消息属于哪个会话也很麻烦。

这个问题的最佳解决方案是什么?

还有一个更笼统的问题:

理想情况下,最好的解决方案是一个框架,我可以在其中为每个对话 'simulate' 一个新的机器人,这样它就可以作为自己的实体并在内存中为自己保存所有 state/message 队列信息。此框架有必要仅在需要根据预设延迟或传入消息执行某些操作时才将资源分配给机器人。有这样的存在吗?

我个人会为此使用 Celery;执行延迟函数调用是它的工作。而且我不知道为什么知道哪些消息属于哪里比在线程中这样做更成问题。

但您可能还想调查 Andrew Godwin 正在进行的新 Django-Channels 工作,因为它旨在支持异步后台任务。