チャットにタイマーを実装するには

5月 13th, 2017

ただだべっているだけでは、ちょっとアプリ的に寂しい。できれば何か多少なりとも「使える」機能を搭載したい。

例えば、タイマーとか。5分後とか1時間後とか、「◯分たったら教えて」と指示すると、指定時間経過後に「時間になったよ」と教えてくれる…そんな機能があれば、ちょっと便利なんじゃないか。

タイマー自体は難しくない。

1.現在時間を取得
2.指定時間だけ待機
3.指定時間を過ぎたら「時間になった」と音なりメッセージなりで知らせる

しかし、チャットボットの基本状態は「入力待ち」中だ。ユーザーとずっとおしゃべりをしていたら、返事をする前に、3の処理を割り込ませて「時間になった」と告げればいい。

でも、ユーザーが他のことをして相手をしてくれていなかったら?ずーーっと入力待ちで、次の入力が来る時でないと、別の処理を行うことができない。

単純に思いつくのは、入力待ちを一旦停止すること。でも調べたところ、これは初心者の手には負えない感じ。

ついでに、今気がついたのだが、そのままだと「指定時間だけ待機」の間、そもそも応答が止まってしまう。待機→時間が来て告げる→チャットに復帰、という状態に。

次に考えたのは、チャット中にタイマー指示が出たら、それを別のタイマーアプリを呼び出して仕事を投げ、タイマーについてはそちらで処理をこなす、というもの。

これなら、問題なさそう…数値の引き渡しに不安があるが、まあ、ファイルに書き込めば、一応渡せなくもない。

呼び出すタイマーアプリは、やっぱりアプリ化しておかねばならないんだろうか…なんて思っていたら、もっといい方法を見つけた。

それはthreading。並列処理を可能にする機能で、threadingをimportすることで使えるようになる。

threadingでタイマー処理を担当させれば、メインのチャットは、そのまま続行していて構わない。時間が来れば、自動的にthreadingの方で指定しておいたタイマー用の処理を実行してくれる。

以下、単純な例。

#coding:UTF-8

import threading

def alert():
    print ('時間になりました')

if __name__ == '__main__':
    print ('秒数を指定して下さい')
    mesget=input('>')
    sec=int(mesget)
    timer = threading.Timer(sec, alert)
    timer.start()

上記だと、threadingを使っている意味がほぼないが、入力受付をループさせると、何が起こるか良く分かるようになる。タイマーをセットした途端に、すぐ次のタイマー指定の入力受付が出てくる。うーん、便利。

関連記事

  1. リスト全ての要素の改行(’\n’)を削る
  2. pythonの「or」はちょっとくせ者っぽい
  3. 変数のidや型をprint文で表示させる
  4. printでの「,」と「+」
  5. クラスの継承を試してみた
  6. 複数リストをループさせた時、ループカウントを得る
  7. 正規表現vs類語辞書
  8. 他のクラスからインスタンス変数って使えるんだね

Comments are closed.