Submit Search
Upload
ふつうのcore.async
•
Download as PPTX, PDF
•
2 likes
•
1,795 views
Tsutomu Yano
Follow
Clojureでgo-routineやErlang軽量プロセスのようなことを実現する非同期ライブラリcore.asyncの使い方などなど
Read less
Read more
Software
Report
Share
Report
Share
1 of 43
Download now
Recommended
Clojure 1.7勉強会の発表資料です。
入門Transducers
入門Transducers
sohta
2015/4/19に開催されたcore.async勉強会の入門セッション用資料です。
入門core.async
入門core.async
sohta
Clojureの特徴と、実際のウェブ開発時に使ってる機能や手法などなど。
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
Tsutomu Yano
KMC 関東例会での講座の資料 (by @nojima)
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
C++1zに導入される見込みの高くなったライブラリ string_view についてお話しします。
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
IS2011勉強会/第一回発表スライド
すごい配列楽しく学ぼう
すごい配列楽しく学ぼう
xenophobia__
2013/07/13に、Sapporo.cppとCLR/Hで合同で開催した勉強会で発表した資料。
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
Recommended
Clojure 1.7勉強会の発表資料です。
入門Transducers
入門Transducers
sohta
2015/4/19に開催されたcore.async勉強会の入門セッション用資料です。
入門core.async
入門core.async
sohta
Clojureの特徴と、実際のウェブ開発時に使ってる機能や手法などなど。
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
Tsutomu Yano
KMC 関東例会での講座の資料 (by @nojima)
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
C++1zに導入される見込みの高くなったライブラリ string_view についてお話しします。
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
IS2011勉強会/第一回発表スライド
すごい配列楽しく学ぼう
すごい配列楽しく学ぼう
xenophobia__
2013/07/13に、Sapporo.cppとCLR/Hで合同で開催した勉強会で発表した資料。
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
JAWS Festa 東海道 2016 の発表スライドです。モデル検査器 Alloy を用いて AWS のリソースをモデル化し、仕様からインフラ設計を自動で生成する流れをお見せします。
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
y_taka_23
第14回 全ゲ連での講演資料です。 Twitter: @Reputeless
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
目grep入門があまりにもKernelVM::入門だという指摘があったため、解説をつけてよりstd::入門に近づけてみました。
目grep入門 +解説
目grep入門 +解説
murachue
DDD においてセットで語られるレイヤードアーキテクチャ。このたび 2 つのプロジェクトにおいて、Laravel 上でレイヤードアーキテクチャを実践する機会に恵まれたので、Laravel の機能・特徴にも焦点をあてながら、事例とともに得られた知見・反省などをお話します。 2018/12/15 開催の PHP Conference 2018 (http://phpcon.php.gr.jp/2018/) の発表資料です。 youtube: https://youtu.be/2D8Rs9SqFiU?t=13762 joind.in: https://joind.in/event/japan-php-conference-2018/laravel--
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Shohei Okada
神戸Pythonの会での SQLAlchemy 入門ハンズオンの資料です。 座学パートの多いSQLAlchemy Primerよりもハンズオンに重点を置いて、日本語で書き直しました。
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
アーキ部#13で使ったスライドです。 サンプルコードはこちらです。 https://github.com/kawasima/revisiting-domain-model
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
2019年5月24日(金)の発表資料をベースに解説等を加えたバージョンです。 Docker Meetup Kansai #3 https://dockerkansai.connpass.com/event/129089/
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
2021年にインフィニットループ社内の新卒向け研修で使われた資料です。
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
Rich Hickeyの有名なプレゼン"Simple Made Easy"を簡単に解説(*> ᴗ •*)ゞ Clojureの基本的な設計思想を理解しよう!
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
(Video of these slides here http://fsharpforfunandprofit.com/ddd) Statically typed functional programming languages like F# encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers. Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time. In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary. Code, links to video, etc., at http://fsharpforfunandprofit.com/ddd NEW AND IMPROVED - added sections on: * why OO, not FP is scary * designing with states and transitions
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
東海道らぐ 2017.10.7 名古屋オフ https://tokaidolug.connpass.com/event/67522/ での発表内容より
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
これからの「async/await」の話をしよう 名古屋GeekBar 2014/09/08 http://www.kekyo.net/2014/09/09/%e3%81%93%e3%82%8c%e3%81%8b%e3%82%89%e3%81%ae%e3%80%8casyncawait%e3%80%8d%e3%81%ae%e8%a9%b1%e3%82%92%e3%81%97%e3%82%88%e3%81%86-%e5%90%8d%e5%8f%a4%e5%b1%8bgeekbar/
これからの「async/await」の話をしよう
これからの「async/await」の話をしよう
Kouji Matsui
社内勉強会向け資料
REST API のコツ
REST API のコツ
pospome
CEDEC2015講演時のスライドに解説をつけました。
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Go初心者がGoでコマンドラインツールの作成に挑戦した話 Yuki Haneda / BizReach.inc / 2017.11.2
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
dcubeio
Lockfree queue introduction in Japanese.
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
Proof Summit 2015 <http: /> で発表した、SAT/SMTソルバの仕組みです。 Proofということで、論理学的側面からの面白さを出来るだけ紹介しています。
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
clojure.specの登場で変わったClojureプログラマの日常。 イマドキのClojure開発を体験しよう!
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
いまさら恥ずかしくてasyncをawaitした 第9回まどべんよっかいち in じばさん三重 開発室 http://www.kekyo.net/2014/07/26/%e3%81%84%e3%81%be%e3%81%95%e3%82%89%e6%81%a5%e3%81%9a%e3%81%8b%e3%81%97%e3%81%8f%e3%81%a6async%e3%82%92await%e3%81%97%e3%81%9f-%e7%ac%ac9%e5%9b%9e%e3%81%be%e3%81%a9%e3%81%b9%e3%82%93%e3%82%88/
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Kouji Matsui
More Related Content
What's hot
JAWS Festa 東海道 2016 の発表スライドです。モデル検査器 Alloy を用いて AWS のリソースをモデル化し、仕様からインフラ設計を自動で生成する流れをお見せします。
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
y_taka_23
第14回 全ゲ連での講演資料です。 Twitter: @Reputeless
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
目grep入門があまりにもKernelVM::入門だという指摘があったため、解説をつけてよりstd::入門に近づけてみました。
目grep入門 +解説
目grep入門 +解説
murachue
DDD においてセットで語られるレイヤードアーキテクチャ。このたび 2 つのプロジェクトにおいて、Laravel 上でレイヤードアーキテクチャを実践する機会に恵まれたので、Laravel の機能・特徴にも焦点をあてながら、事例とともに得られた知見・反省などをお話します。 2018/12/15 開催の PHP Conference 2018 (http://phpcon.php.gr.jp/2018/) の発表資料です。 youtube: https://youtu.be/2D8Rs9SqFiU?t=13762 joind.in: https://joind.in/event/japan-php-conference-2018/laravel--
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Shohei Okada
神戸Pythonの会での SQLAlchemy 入門ハンズオンの資料です。 座学パートの多いSQLAlchemy Primerよりもハンズオンに重点を置いて、日本語で書き直しました。
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
アーキ部#13で使ったスライドです。 サンプルコードはこちらです。 https://github.com/kawasima/revisiting-domain-model
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
2019年5月24日(金)の発表資料をベースに解説等を加えたバージョンです。 Docker Meetup Kansai #3 https://dockerkansai.connpass.com/event/129089/
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
2021年にインフィニットループ社内の新卒向け研修で使われた資料です。
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
Rich Hickeyの有名なプレゼン"Simple Made Easy"を簡単に解説(*> ᴗ •*)ゞ Clojureの基本的な設計思想を理解しよう!
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
(Video of these slides here http://fsharpforfunandprofit.com/ddd) Statically typed functional programming languages like F# encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers. Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time. In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary. Code, links to video, etc., at http://fsharpforfunandprofit.com/ddd NEW AND IMPROVED - added sections on: * why OO, not FP is scary * designing with states and transitions
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
東海道らぐ 2017.10.7 名古屋オフ https://tokaidolug.connpass.com/event/67522/ での発表内容より
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
これからの「async/await」の話をしよう 名古屋GeekBar 2014/09/08 http://www.kekyo.net/2014/09/09/%e3%81%93%e3%82%8c%e3%81%8b%e3%82%89%e3%81%ae%e3%80%8casyncawait%e3%80%8d%e3%81%ae%e8%a9%b1%e3%82%92%e3%81%97%e3%82%88%e3%81%86-%e5%90%8d%e5%8f%a4%e5%b1%8bgeekbar/
これからの「async/await」の話をしよう
これからの「async/await」の話をしよう
Kouji Matsui
社内勉強会向け資料
REST API のコツ
REST API のコツ
pospome
CEDEC2015講演時のスライドに解説をつけました。
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Go初心者がGoでコマンドラインツールの作成に挑戦した話 Yuki Haneda / BizReach.inc / 2017.11.2
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
dcubeio
Lockfree queue introduction in Japanese.
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
Proof Summit 2015 <http: /> で発表した、SAT/SMTソルバの仕組みです。 Proofということで、論理学的側面からの面白さを出来るだけ紹介しています。
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
clojure.specの登場で変わったClojureプログラマの日常。 イマドキのClojure開発を体験しよう!
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
いまさら恥ずかしくてasyncをawaitした 第9回まどべんよっかいち in じばさん三重 開発室 http://www.kekyo.net/2014/07/26/%e3%81%84%e3%81%be%e3%81%95%e3%82%89%e6%81%a5%e3%81%9a%e3%81%8b%e3%81%97%e3%81%8f%e3%81%a6async%e3%82%92await%e3%81%97%e3%81%9f-%e7%ac%ac9%e5%9b%9e%e3%81%be%e3%81%a9%e3%81%b9%e3%82%93%e3%82%88/
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Kouji Matsui
What's hot
(20)
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
目grep入門 +解説
目grep入門 +解説
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
これからの「async/await」の話をしよう
これからの「async/await」の話をしよう
REST API のコツ
REST API のコツ
クロージャデザインパターン
クロージャデザインパターン
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Lockfree Queue
Lockfree Queue
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Everyday Life with clojure.spec
Everyday Life with clojure.spec
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
ふつうのcore.async
1.
ふつうのプログラムで 使うcore.async 2018/5/18 矢野勉
2.
core.async使ってますか ? まとまっとドキュメントがない いい感じのチュートリアルがない 注意すべきポイントが共有されてない ノウハウが共有されていない
3.
というわけで 基礎と使い所の話
4.
入門編
5.
;; goブロック内は非同期に動く ;; 非同期ブロック内でチャンネルにデータを書く (go (>!
ch data)) ;; 別のgoブロックで同じチャンネルをreadする ;; こちらも別の非同期処理として動く (go-loop (when-some [data (<! ch)] (do-action data) (recur))) 基本形 goブロックで非同期処理を作り、その中でチャンネルに書いたり読んだりする。 全てのgoブロックはcore.async管理下のスレッドにより効率的に切り替わる
6.
go/thread/recur go IO待ちが発生しない処理に使います。 goの中でIO待ちが発生する処理(API呼び出しやDBアクセス、ファイルアクセス) が発生する場合は、その部分をさらにthreadで囲むのが理想的です。 固定数のスレッドプールを使うので、一度に動けるgoブロックの数は制限されます 。ちゃんと切り替えることが重要。
7.
thead IO待ちなどブロックするしょりに使います。 キャッシュ化スレッドプールを使って起動されるので、プールを使い切るというこ とがありません go/thread/recur
8.
go/thread/recur go-loop (go (loop 処理) の、単なる省略形です。 「動き続ける処理は必ずgo-loopを使う」というのはよくある勘違いなので注意。go やthreadのなかでloopすればなんでもいいんです。
9.
recur goブロックは単なる非同期ブロックなので、自分でループしないと、すぐに死にま す。 たまに、recurを忘れて「軽量プロセスなのになんですぐ落ちるんだ」と悩む人がい るそうです。 go/thread/recur goやthreadのなかでloop/recurして、はじめて軽量プロセス的なものになるのであっ て、逆ではありません。
10.
chan チャンネルの作成関数だけど、引数が結構あるので、ちゃんと知っておくと便利 chan/buffer (chan (buffer 10)
;バッファ (filter #(not= (:type %) :error) ; transducer #(log/error % “an error occurred.”)) ; 例外ハンドラ
11.
buffer チャンネルへのアクセスバッファ。 transducerを指定する場合は、最低でも1を指定する必要がある chan/buffer チャンネルアクセスでプログラムが停止するのを抑止するキーファクターです。 とても重要。 十分な数のバッファを指定するか、sliding-bufferやdropping-bufferのような、溢れた 場合のアクションが付いているバッファの使用を検討しましょう
12.
timeout 一定時間経つと値が取れるだけのチャンネルを作る関数です。 timeout/alt!/alts! 基本的にalt!と組み合わせて使いますが、一定時間ごとに処理を行うループを作ると きにも使います。 (go-loop ;; なにかアクション (<! (timeout
5000)) ; 5秒停止。 ;; チャンネルアクセスを含むので他のブロックに切り替わる (recur))
13.
alts!/alts!! core.asyncのキラー機能の一つ。 timeout/alt!/alts! 複数のチャンネルを渡すと、一番最初に結果が取れるようになったチャンネルを返 します。
14.
alts!/alts!! timeout/alt!/alts! (go (let [amazon-ch (access-to-amazon
args) google-ch (access-to-google args) [value ch] (alts! [amazon-ch google-ch])] (cond (= ch amazon-ch) (println “amazon result:” value) (= ch google-ch) (println “google result:” value))))
15.
書くこともできます timeout/alt!/alts! (go (let [[result ch]
(alts! [[amazon-ch send-value] [google-ch send-value]])] (cond (= ch amazon-ch) (println “amazon result:” result) (= ch google-ch) (println “google result:” result)))) 最初に書き込み完了したチャンネルと値が帰ってきます 書き込み処理の結果は、かけたかどうかだけなので、true/falseのいずれかです
16.
alt!/alt!! timeout/alt!/alts! (go (let [v (alt! [read-ch] ([v
ch] (log/info “value=“ v) v) [(timeout 5000)] ([v ch] (log/warn “Timeout!!“) nil))] ;; なんか処理)) 便利マクロ。「どのチャンネルか?」のチェックが不要なので使いやすいです。 timeoutと組み合わせて使うことで、チャンネルへのアクセスにタイムアウトを設定 できるので、よく使います。
17.
alt!/alt!! timeout/alt!/alts! (go (let [v (alt! [[write-ch
value]] :sent [(timeout 5000)] :timeout)] (case v :sent (log/info “sent!!”) :timeout (log/warn “Send timeout!!”)))) 書き込みタイムアウトを指定したい場合にも使えます。
18.
タイムアウト重要! すべてのチャンネル操作に指定する必要はないが、アプリがチ ャンネル操作を開始する操作には、必ず指定すべき。 だから alt!/alt!! はほぼ必須です IOがすごく遅延することもあるし、プログラムミスでチャンネ ル同士が互いに待つ(デッドロック)を生み出してしまうこと もあります タイムアウトが設定されていれば、その部分でちゃんと落ちて くれます。
19.
mult, tap いざというとき役立つやつ ひとつのチャンネルを複数に分割して、すべての分割チャンネルに同じデータが流 れる構造を作れます
20.
いざというとき役立つやつ pub, sub 一つのチャンネルから「交付(publication)」を作り、それに「購読(subscript)」する ことで、あるチャンネルから条件に合致するデータだけを受け取る別のチャンネル を作り出せます
21.
pipelineに乗せろ • core.asyncの非同期ブロックを複数個起動した時の処理は 結構めんどくさい • 非同期ブロックで起きた例外はどうするのか、とか •
pipelineに乗せると少し楽になる
22.
大きく3種類 pipeline pipeline-blocking pipeline-async
23.
CPUを使い切る処理 (ブロックしない) ブロックする処理 非同期ブロックの管理はま かせる pipeline pipeline-blocking 非同期ブロックの選択も起 動も自分で行う
pipeline-async
24.
pipeline pipeline-blocking 平行数とTransducerを指定すると、チャンネルに書くたびに並列でTransducerが 実行されます。 (pipeline 5 out-ch
(map string/upper-case) in-ch true ex-handler) in-chに入ってきた順番で、out-chに結果が入っていくことが保証されます。 transducerで例外が発生すると、ex-handlerに渡した関数が呼び出されます。 第5引数のbooleanがtrueだと、in-chが閉じるとout-chも閉じます。
25.
pipeline-async transducerの代わりに、in-chに入ってきた値と、結果出力用のチャンネルの2引数 を受け取る関数を指定します。 非同期ブロック(goやthread)の起動は、関数内で自分で行います。 (pipeline 5 out-ch
(fn [v ch] (go (>! ch :result))) in-ch true ex-handler) こちらも、in-chに入ってきた順番で、out-chに結果が入っていくことが保証され ます。 transducerで例外が発生すると、ex-handlerに渡した関数が呼び出されます。 データによってgoとthreadを使い分けたり、複数の非同期ブロックを起動したり できます。
26.
並列数が指定できるので • pipeline-blockingなら、API呼び出しの同時アクセス数を 制限することができる(pmapにはできない) • pipelineなら、同時処理数をCPUコア数に制限することが できる
27.
実践編
28.
APIコールを並列化して効率 化したいなあ • pmapなら簡単に並列化できる • でも、pmapは引数のコレクションの要素数だけスレッ ド起動しちゃうので、相手のAPIに大量のアクセスがい ってしまうかも。。
29.
pipeline-blockingでできる (defn post-data-to-api [data-coll] (let [in-ch
(chan 1) out-ch (chan 1)] (pipeline-blocking 5 out-ch (map #(call-api %)) ;;transducer in-ch true (fn [ex] (log/error ex “Error!!”) nil)) (onto-chan in-ch data-coll) ;; in-chに全部入れる ;; 以下、out-chを読み込む処理 ))
30.
アプリ全体でAPIコールの並 列数を制限したい • Webサーバとかだと、たくさんリクエストがきても、API へのアクセス数は「全体で最大10並列」とかに制限した いですよね。 • 毎回pipelineを作ると、pipeline単位で10並列になるだ け。
31.
pipelineを閉じなけれ ばいい
32.
ただしpipelineを閉じないと いうことは • transducerに渡ってくるデータは、たくさんのリクエスト がまざったものになります。 Pipeline ここが並列にな る
33.
データにIDをつける (defn transaction-id [] (str (UUID/randomUUID))) (defn
make-request [id data] {:transaction-id id :data data})
34.
pub/subで自分のIDのデータ だけに絞る ;; out-chから、:transaction-idで購読できるpublicationをつくる (def publication
(pub out-ch :transaction-id)) ;; 自分のIDを指定して購読 (let [my-id-ch (chan 10)] ;my-id-chには、:transaction-idがidと ;合致するデータだけが流れ込んできます (sub publication id my-id-ch)) ;idは自分のtransaction-id pub関数、sub関数を使うと、チャンネルから取れるデータのうち、条件に合う データだけが読める、別のチャンネルを作ることができます。 これを利用して、自分のtransaction-idと同じデータだけを読めるチャンネルを 作り出します。
35.
終端データを決める (defn make-end-data “:data部が ::end
であるデータを終端とみなす” [id] {:transaction-id id :data ::end}) ;; 例 (go-loop [] (when-let [data (<! ch)] (let [value @data] (when (not= ::end (:data value)) (my-action) (recur))))) pipelineが閉じない=チャンネルも閉じない、ということなので、 「チャンネルが閉じるまで読み続ける」という定番ループは作れない なので、データを入れる時に終端データを入れる。読むときは 「終端データが来るまで読む」というループにする
36.
平行化するだけじゃなく、コレクションを 入れたらコレクションで結果がほしいな • 使う側にとってはコレクションを関数に渡したら、勝手 に並列で処理が走って、結果もコレクションになってて ほしい。 • ちょうどpmapがやってくれるような形にしたい
37.
lazy-seqと組み合わせる ;;; pipelineのout-chがすでにある前提 ;;; 全部処理が終わったら、out-chも閉じるはずなので、それまで再帰する ;;;
遅延シーケンスを作れば良い (letfn [(make-lazy-seq [ch] (lazy-seq (if-some [v (<!! ch)] (cons v (make-lazy-seq ch)) [])))] ;チャンネルが閉じたので再帰しない。 (make-lazy-seq out-ch))
38.
非同期処理で起きた例外をメイ ンスレッドでキャッチしたい • 例外ハンドラは非同期スレッド内で呼ばれるので、アプ リ全体のグローバルな例外処理に例外が渡らなくて困る ことがある
39.
チャンネルに渡す値はbox化する いくつかのオープンソースのライブラリでも同様の方法でチャン ネルを扱っています チャンネルにはnilをかきこむことはできませんが、box化すると、 処理の結果値としてnil値を返すこともできるので便利です。 atomやfutureのように、derefで値を取り出せるような何かに、実 際の値をラップします。 deref時に、値が例外であれば例外をスローするように実装します 。
40.
;; boxを作る関数 (defn box [value] (reify clojure.lang.IDeref (deref
[this] (if (instance? Throwable value) (throw value) value)))) ;; 関数を実行して結果をboxにして返す関数。 ;; 例外発生時は例外をラップしたboxを返す (defn do-action [f input-data] (try (box (f input-data)) ; 関数の結果をbox化する (catch Throwable ex (box ex)))) ;例外発生時も単にbox化する
41.
;; 読む側は、単にderefすれば、読んだスレッドで ;; 勝手に例外がスローされる (loop
[] (when-some [result (<!! ch)] (let [value @result] ;; なにかvalueを使った処理 (recur))))
42.
非同期処理を使うと 大抵使うテクニックなので、 できればライブラリ化したい
43.
おわり
Download now