タグ

2017年9月5日のブックマーク (9件)

  • Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと - Qiita

    分かっていたつもりなのにまたやってしまったので、自戒を込めて書いておきます。 forループ内でgoroutineを使う場合の注意点 for内でgoroutineを実行する際にやりがちなミスがあります。 以下のコードを見てください。 package main import ( "fmt" "time" ) func main() { values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} for _, val := range values { go func() { fmt.Println(val) }() } // goroutineが終了するまで待つ。 // コード簡素化のためにsleepしているだけだが、 // 来はsync.WaitGroupとかchannel使うなど適切な処理をすべき。 time.Sleep(1 * time.Second)

    Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと - Qiita
  • 【Go言語】ループ内でのgoroutine生成の潜在的なエンバグポイントについて - DRYな備忘録

    1番、よくやるやつ(やばめ) for _, user := range users { go func() { user.SomeHeavy() }() } 非同期で生成されるクロージャの中で、参照されるuserはループ内スコープのそれなので、たとえばループのn番目とn+1番目の処理において、同じn+1番目のユーザに重複してSomeHeavy()を実行してしまう危険性がある。ぜんぜん閉包じゃない。今回の主題は、この潜在的なエンバグポイントを、どうすれば事前に防げるか、防げるコーディング規約があるか、みたいな興味。 2番、よくやるやつ(だいたい) for _, user := range users { go func(u *User) { u.SomeHeavy() }(user) } ちゃんとクロージャ内でのスコープとなるように渡す。これなら1番の問題は起きない。 そもそも、1番のように

    【Go言語】ループ内でのgoroutine生成の潜在的なエンバグポイントについて - DRYな備忘録
  • Goルーチンで並行化する方法: 6秒かかる処理を3秒にしよう - Qiita

    まず直列実行するプログラムを書く 1秒待つコマンド 2秒待つコマンド 3秒待つコマンド 上記を順番に実行していくプログラムを main.go の中身を書く。 つまり、合計で6秒かかってしまう。 package main import ( "log" "time" ) func main() { log.Print("started.") // 1秒かかるコマンド log.Print("sleep1 started.") time.Sleep(1 * time.Second) log.Print("sleep1 finished.") // 2秒かかるコマンド log.Print("sleep2 started.") time.Sleep(2 * time.Second) log.Print("sleep2 finished.") // 3秒かかるコマンド log.Print("sleep3

    Goルーチンで並行化する方法: 6秒かかる処理を3秒にしよう - Qiita
  • Golang Goの並列処理を学ぶ(goroutine, channel) - Qiita

    Goのコンカレンシー、略して合コンを勉強したわけですが。 Tour of Goの例とかはさっぱり良くわからないので "Goルーチンで並行化する方法: 6秒かかる処理を3秒にしよう" を参考にして遊んでみました。コードもこの記事からとったものです。大変わかりやすい例で、並行処理の素晴らしさがよく分かる記事でした。 package main import ( "fmt" "time" ) func threeSecond() { time.Sleep(3000 * time.Millisecond) fmt.Println("3 seconds passed") } func oneSecond() { time.Sleep(1000 * time.Millisecond) fmt.Println("1 second passed") } func twoSecond() { time.Sle

    Golang Goの並列処理を学ぶ(goroutine, channel) - Qiita
  • goroutine 使い方まとめ - Qiita

    goroutineとはなにか? 軽量スレッドである、並行処理で複数のスレッドが立てられる 「go」というシンプルなメソッドを使ってスレッドを立てる 「channel」は複数のgoroutineにメッセージを送るもの また「select」は複数のchannelを管理するものである mainの関数が終了しないようにgoroutineを制御する仕組みは「channel」か「sync」を使用する 以下の例はchannelを使用して複数のリクエストを並行処理で書いてある例である。 package main import ( "fmt" "log" "net/http" "time" ) func getStatus(urls []string) <-chan string { statusChan := make(chan string) for _, url := range urls { go

    goroutine 使い方まとめ - Qiita
  • golang でループを手っ取り早く並列化する方法 — KaoriYa

    func execLoop(list []Item) { for _, item := range list { do_something(item) } } list に格納された各 item に対して do_something() を適用する、よくあるタイプのループ処理です。 goroutine で並列化、その副作用 golang ではこの do_something() の適用を超お手軽に並列化できます。あ、もちろん do_something() はリエントラントである前提ですね。

  • tcp_tw_なんとかの違い - Qiita

    自分用の覚書です。CentOS5とか6とかでの経験。 実際高負荷だとか負荷試験ツールで出ただとかのTIME_WAITを減らしたいというときに、 syctlで、tcp_なんとかを調整するというのは今ではよくあると思います。 (わたしはむかし運用していた某無料サイトで負荷に悩んだのが切欠で知りました。無料というだけで会員数激増的な風潮だったのと素行の悪い某国のクローラーとかrewriteのループとかの色々な芸の肥やし的な機会がというか夜中に起こされて眠りを妨げられたくなかったので色々調べたりしていました。) いっぱい接続したいの - (ひ)メモ Linux - ぜんぶTIME_WAITのせいだ! - Qiita ・TCPの終了待ちタイムアウト秒数を設定(default60sec) net.ipv4.tcp_fin_timeout = 10 ソケットを強制的にクローズする前に、最後のFINパケッ

    tcp_tw_なんとかの違い - Qiita
  • GolangでCLIの場合にcobraを使うことにした件

    最初はCLI用のフレームワークに codegangsta/cli を使っていました。 サクっと書けるのですけれども、ちょっとややこしいことをしようとした時に悩むんですよね。 ということで、もしかしたら他の方がいいのかなーなどと考えた次第。 で、spf13/cobraなんですが、KubernetesやHugoが採用しているということで興味はあったものの情報があまりなかったので、まじめにREADMEも読んでいなかったのです。 https://github.com/spf13/cobra あらためてちゃんと見てみたところ、あ、これはすばらしい、という点が多々ありまして、既存のコードをすぐcobraに書き換えました。 ・サブコマンドが個別の.goファイル単位で追加できる ・サブコマンドにコマンドを追加することができる ・フラグにスコープが付けられる(サブコマンド以下へ引き継ぐか否か) ・実行前後に

  • CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる - Qiita

    はじめに Go 言語でコマンドラインツールを作ることができる Cobra というパッケージがあります。僕が最近愛用している hugo も採用したという非常に優れたパッケージです。 Cobra https://github.com/spf13/cobra 今回はこの Cobra を使って、2つの数字を指定すると足し算を行ってくれる go-keisan というコマンドラインツールを作ってみました。 go-keisan の仕様 稿で作ろうとしている go-keisan の仕様はこんな感じ。 //バージョン番号を表示 >go-keisan version //使い方を説明 >go-keisan help //サブコマンド add で足し算の結果を返す >go-keisan add 12 34 46

    CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる - Qiita