Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中添加简单的延迟任务?_Django_Multithreading_Celery_Chatbot - Fatal编程技术网

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

如何在Django中添加简单的延迟任务?,django,multithreading,celery,chatbot,Django,Multithreading,Celery,Chatbot,我正在创建一个聊天机器人,需要一个解决方案,以便在特定延迟后向用户发送消息。我用Nginx、Gunicorn和Django设置了我的系统。其想法是,如果机器人需要向用户发送多条消息,它可以将后续的每条消息延迟一定时间,然后再发送给用户,使其看起来更“人性化” 但是,简单的线程化.Timer方法不起作用,因为用户可能会在提示将来更改消息的任何时刻中断此过程,但计时器线程可能无法停止,因为它们位于不同的工作线程上。到目前为止,我遇到了两种解决方案: 使用threading.Timer盲目地检查数据库

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

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

  • 使用
    threading.Timer
    盲目地检查数据库中的发送列表,可能会导致大量不需要的线程出现问题。也会使数据库不那么干净/有序
  • 使用芹菜或其他一些系统来执行这些未来的任务。似乎过度杀戮和过度工程是一个简单的问题。任务始终只是延迟的函数调用。处理哪些消息属于哪些对话也是一件麻烦事
  • 这个问题的最佳解决方案是什么

    还有一个更一般的问题:


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

    我个人会用芹菜来做这个;执行延迟的函数调用是它的工作。我不知道为什么知道什么消息属于哪里比在一个线程中执行更困难


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

    我的意思是处理取消任务。我必须将任务ID存储在某个地方(我猜是一个数据库),才能知道针对特定对话取消哪些任务。Django通道看起来很酷,但对于我的用例来说仍然有点混乱(可能是过度使用)。