質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

解決済

go言語でタイマーAPIの作成について

ts.tubasa
ts.tubasa

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

1回答

0評価

1クリップ

1929閲覧

投稿2017/06/08 09:49

Go言語と、Framework [echo]を利用してAPIを作成しております。

特定のデータごとのタイマーを、Web APIを利用して実装したいと考えております。

処理の流れとしましては下記のような実装を考えております。

1.タイマー開始用のAPIにパラメーター付きでアクセスし、goroutineで、別プロセスを起動
2.タイマー停止用のAPIにパラメーター付きでアクセスし、既に動いているgoroutineを検知し、プロセスを停止

実際に実装を行い別プロセス毎に、動かせているような実装はできました?…。

しかし、2の処理を行うと、プログラムが停止しません。

そもそも、実現しようとしていることに無理があるのかもしれませんが、
アドバイスを頂けると幸いです。

大変、お手数をおかけしますが、宜しくお願い致します。

▼main.go

go

package main import \( "sample/handler" _ "github\.com/go-sql-driver/mysql" "github\.com/labstack/echo" "sample/data" \) func main\(\) { // トップディレクトリ e := echo\.New\(\) ch := make\(chan bool\) // 製品を監視するタイマー var ids = make\(\[\]\*data\.Ids, 0\) e\.GET\("start", handler\.Start\(ch, ids\)\) e\.GET\("stop", handler\.Stop\(ch, ids\)\) e\.Logger\.Fatal\(e\.Start\(":1323"\)\) }

▼handler/start.go

Go

package handler import \( "github\.com/labstack/echo" "net/http" "fmt" "time" "strconv" "sample/data" \) func Start\(ch chan bool, ids \[\]\*data\.Ids\) echo\.HandlerFunc { return func\(c echo\.Context\) error { id := c\.QueryParam\("id"\) limit, _ := strconv\.Atoi\(c\.QueryParam\("limit"\)\) go func\(\) { //result = append\(result, &\(data\.Ids{Id: v\.Id}\)\) ids = append\(ids, &\(data\.Ids{Id:id}\)\) t := time\.NewTicker\(3 \* time\.Second\) // 1秒おきにチェック n := 0 for { select { case <-t\.C: if \( limit < n\) { fmt\.Print\("over"\) } fmt\.Print\("id =" \+ id\) fmt\.Println\(n\) n\+\+ case <-ch: fmt\.Println\("stop"\) t\.Stop\(\) } } }\(\) return c\.JSON\(http\.StatusCreated, "ok"\) } }

▼handler/stop.go

Go

package handler import \( "github\.com/labstack/echo" "net/http" "sample/data" "fmt" \) func Stop\(ch chan bool, ids \[\]\*data\.Ids\) echo\.HandlerFunc { return func\(c echo\.Context\) error { id := c\.QueryParam\("id"\) arrayRemove\(ids, id\) ch <- true return c\.JSON\(http\.StatusCreated, "ok"\) } } func arrayRemove\(arr \[\]\*data\.Ids, str string\) \[\]\*data\.Ids { fmt\.Println\("remove"\) result := make\(\[\]\*data\.Ids, 0\) for _, v := range arr { if v\.Id != str { result = append\(result, &\(data\.Ids{Id: v\.Id}\)\) fmt\.Println\(v\.Id\) } } return result }

▼sample/data/ids.go

Go

package data type Ids struct { Id string }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。