断続的にデータを受けながら並行で時間差リアクションを行う - すぎゃーんメモちょっと動きは違うんだけど、こういうパターンもあるよねー。という事で。
断続的にデータを受けながら並行で時間差リアクションを行う Go はじめて、の次のGo - すぎゃーんメモ にて作った go-genki-bot 、UserStreamから Tweet 取得して返信する...
http://d.hatena.ne.jp/sugyan/20140705/1404493007
package main
import (
"bufio"
"fmt"
"os"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
queue := make(chan rune, 5)
t := time.AfterFunc(-1, func() {
// ある分だけ読み込む
leave: for {
select {
case r := <-queue:
fmt.Println("recv", string(r))
case <-time.After(100 * time.Millisecond):
// 100ms 読めなかったら諦める
break leave
}
}
})
// タイマーは止めておく
t.Stop()
in := bufio.NewReader(os.Stdin)
for {
// 何かキー入力
r, _, err := in.ReadRune()
if err != nil {
break
}
// LFはいらない
if r == 0x0A {
continue
}
// タイマーを活性化(3秒後)
t.Reset(3 * time.Second)
// タイマーに読んで貰う為に入力したキーをchanで送信しておく
queue<-r
}
}
入力を得たらタイマーを活性化する。タイマーは一つしか使わなくて、データが来るたびに更新するのでデータが最後の入力から3秒間何も更新がなければ発動する。タイマーは発動すると100ms内に見つかった分だけ抜き取って表示。
$ go run jisa.go
あ
recv あ
あいうえ
recv あ
recv い
recv う
recv え
この手法は gof の画面表示部分で使われていて、連続するキー入力に対して毎回描画を行っていると画面がチラ付くという問題を回避出来る。詳しくは以下を参照して下さい。
Golang でコマンドライン Fuzzy Finder 「gof」作った。 - Qiita
この記事は Go Advent Calendar 2013 の 10 日目の投稿です。 はじめに 業務のツールや連携させる一部の機能として golang を使い出している方もチラホラ現れ始めました。 ...
http://qiita.com/mattn/items/edea1be5a6d84663ab8b
Go Advent Day 19 - Eject the Web - The Gopher Academy Blog
Other Articles Next article Go Advent Day 20 - Go in Academia: Emulating Wireless Networks Previous ...
http://blog.gopheracademy.com/day-19-eject-the-web