タグ

2017年1月18日のブックマーク (4件)

  • Big Sky :: golang の sync パッケージの使い方

    golang と言えば非同期に特化した言語ですが、慣れない内は簡単な非同期しか使えません。しかし sync パッケージを知る事でもっとカジュアルに、かつ確実な非同期処理を行う事が出来る様になります。 今日はそんな sync パッケージについて説明してみたいと思います。 sync.Mutex ご存じ sync.Mutex です。皆さんが一番使う排他制御だと思います。 package main import ( "fmt" "runtime" "sync" "time" ) func parallel(wg *sync.WaitGroup) { fmt.Println("博") time.Sleep(100 * time.Millisecond) fmt.Println("多") time.Sleep(100 * time.Millisecond) fmt.Println("の") time.

    Big Sky :: golang の sync パッケージの使い方
  • トランザクション — Redis Documentation (Japanese Translation)

    トランザクション¶ MULTI, EXEC, DISCARD および WATCH は Redis におけるトランザクションの基です。これらは、複数のコマンドの実行をひとつのステップで行えるようにします。その際、2 つの重要な点が保証されます。 トランザクション中のすべてのコマンドは直列化され、順に実行されます。他のクライアントにより発行されたリクエストが、Redis トランザクションの 途中に 入り込むことはありません。このことは、コマンド群がひとつの隔離されたオペレーションとして実行されることを保証します。 すべてのコマンドが実行されるか、ひとつも実行されないかのいずれかであり、すなわち Redis のトランザクションはアトミックです。 EXEC コマンドはトランザクション中の全コマンドの実行のトリガです。もし、クライアントがトランザクションの途中で、 MULTI [訳注: EXEC

  • redis(predis)でパイプライニング(pipelining)を使って高速にコマンドを実行する - Qiita

    redisにパイプライニングといって複数のコマンドを一括実行する機能があります。 これを使うことでひとつひとつコマンドを実行するよりも圧倒的に高速な実行が可能です。 僕の環境ではhset(),expire()を1万回繰り返して確認したところ約5倍の性能差がありました。 クライアントライブラリによってはmulti/execのオプションなどでパイプラインを実行するものもあるため、自分が使う クライアントライブラリにおけるパイプライン処理の実装方法をしっかり確認しておく必要があります。 predisというクライアントライブラリではpipeline()メソッドというパイプラインのためのメソッドが用意されており これによって取得できるPipelineクラスのインスタンスを使ってコマンドを指定します。 以下はpredisで1万回のhset/expireをパイプラインで処理するコード例です。

    redis(predis)でパイプライニング(pipelining)を使って高速にコマンドを実行する - Qiita
  • golang でループを手っ取り早く並列化する方法 — KaoriYa

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