2016-05-24 11 views
1

私はチャットボットを作成しており、特定の遅延の後に将来ユーザーにメッセージを送信するソリューションが必要です。私はNginx、Gunicorn、Djangoでシステムをセットアップしています。ボットがユーザーに複数のメッセージを送信する必要がある場合、それがより多くの「人間」に見えるように送信する前に、一定の時間だけ後続の各メッセージを遅らせることができます。Djangoで単純な遅延タスクを追加するにはどうすればよいですか?

しかし、ユーザが将来のメッセージの変更を促す任意の瞬間にこのプロセスを中断するかもしれないので、単純なthreading.Timerアプローチは機能しませんが、別のワーカにあるのでタイマースレッドを停止できない可能性があります。これまでのところ私は2つのソリューションで来ている:

  1. 使用threading.Timerを盲目的にデータベース内に、送信リストを確認するために、不要なスレッドの多くの問題を作成することができます。また、データベースのクリーンアップ/整理も容易になります。
  2. これらの将来のタスクを実行するには、セロリーなどのシステムを使用します。過度の操作やオーバーエンジニアリングのような単純な問題があるようです。タスクは常に関数呼び出しを遅らせるだけです。どのメッセージがどの会話に属しているかを扱う面倒もあります。

この問題を解決するにはどうすればよいでしょうか?

また、より一般的な質問:

理想的に最善の解決策は、それは、独自のエンティティとして動作し、すべての状態/メッセージ・キューを保持しているので、私は各会話のための新しいボット「をシミュレート」することができますフレームワークになります自分自身のためのメモリ内の情報。このフレームワークは、あらかじめ設定された遅延や着信メッセージに基づいて何かを行う必要がある場合にのみ、ボットにリソースを割り当てる必要があります。このような存在は何ですか?

答えて

1

個人的に私はこれにセロリを使用します。遅延関数呼び出しを実行するのがその仕事です。そして、スレッドでそれを行うよりも、どこにメッセージがあるのか​​が分かっているのはなぜ分かりません。

Andrew Godwinが行っている新しいDjango-Channelsの作業は、非同期バックグラウンドタスクをサポートするためのものであるため、調査することもできます。

+0

私はタスクをキャンセルすることを意味しました。特定の会話に対して取り消すタスクを知るために、タスクIDをどこかに格納する必要があります(私はデータベースを推測しています)。 Django-Channelsは、私のユースケース(恐らく過度の使用)にはまだ少し混乱していますが、涼しく見えます。 – PeterG

関連する問題