入門core.async

S
入門core.async
core.async勉強会
2015/4/19@HaLake
@athos0220
アジェンダ
core.asyncとは
コアコンセプト
基本的なAPIの使い方
ちょっと進んだトピック
core.asyncとは?
core.asyncとは?
非同期プログラミング用ライブラリ
CSPライクなチャネル通信をベースとしている
Go言語のgoroutineにインスパイアされたgoブ
ロックを提供
コアコンセプト
チャネル
並行に動くタスク間で値を受け渡す通信路
producer channel consumer
チャネル
並行に動くタスク間で値を受け渡す通信路
producer channel consumer
チャネル
並行に動くタスク間で値を受け渡す通信路
producer channel consumer
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
バッファがいっぱいだったら?
チャネル
並行に動くタスク間で値を受け渡す通信路
producer consumer
実際にはバッファを持ったキュー
バッファがいっぱいだったら? バッファが空だったら?
協調スレッド(IOCスレッド)
以下のような場合に制御が別のスレッドに切り替わる
値を受信しようとしたときにバッファが空
値を送信しようとしたときにバッファがいっぱい
IOC = Inversion of Control
(go
(while true
(let [v (<! ch)]
(println v))))
(go
(loop [i 0]
(>! ch i)
(recur (inc i))))
協調スレッド(IOCスレッド)
以下のような場合に制御が別のスレッドに切り替わる
値を受信しようとしたときにバッファが空
値を送信しようとしたときにバッファがいっぱい
IOC = Inversion of Control
(go
(while true
(let [v (<! ch)]
(println v))))
(go
(loop [i 0]
(>! ch i)
(recur (inc i))))
上記の場合には  が実行されずに制御が切り替わる(パーク)
協調スレッド(IOCスレッド)
グリーンスレッド(ネイティブスレッドでない)ので生成の
コストが低い
シングルスレッドの場合でも使える(ClojureScriptでも!)
native thread native thread native thread
IOCthread
IOCthread
IOCthread
IOCthread
IOCthread
IOCthread
IOCthread
IOCthread
IOCthread
基本的なAPIの使い方
チャネル生成と送受信
チャネル生成:chan
送信:>!, >!!
受信:<!, <!!
(let [ch (chan 2)]
(>!! ch 0)
(>!! ch 1)
[(<!! ch) (<!! ch)])
;=> [0 1]
チャネル生成と送受信
チャネル生成:chan
送信:>!, >!!
受信:<!, <!!
(let [ch (chan 2)]
(>!! ch 0)
(>!! ch 1)
[(<!! ch) (<!! ch)])
;=> [0 1]
バッファのサイズを指定
チャネル生成と送受信
ブロッキング ノンブロッキング
送信 >!!
バッファが一杯ならブロック
>!
バッファが一杯ならパーク
受信 <!!
バッファが空ならブロック
<!
バッファが空ならパーク
チャネル生成と送受信
ブロッキング ノンブロッキング
送信 >!!
バッファが一杯ならブロック
>!
バッファが一杯ならパーク
受信 <!!
バッファが空ならブロック
<!
バッファが空ならパーク
後述のgoマクロ内でのみ使用可
goマクロ
協調スレッドで処理を実行する
(let [ch (chan 2)]
(go (while true
(let [v (<! ch)]
(println “received” v))))
(>!! ch “hi”)
(>!! ch “there”))
;; received hi
;; received there
timeout
(let [t (timeout 100)
begin (System/currentTimeMillis)]
(<!! t)
(println “Waited”
(- (System/currentTimeMillis)
begin)))
;; Waited 100
タイムアウト用のチャネルを生成する
alts!
一度に複数のチャネルから待ち受ける
(let [c1 (chan)
c2 (chan)]
(go (while true
(let [[v ch] (alts! [c1 c2])]
(println “received" v))))
(go (>! c1 "hi"))
(go (>! c2 "there")))
;; received hi
;; received there
alts!
一度に複数のチャネルから待ち受ける
(let [c1 (chan)
c2 (chan)]
(go (while true
(let [[v ch] (alts! [c1 c2])]
(println “received" v))))
(go (>! c1 "hi"))
(go (>! c2 "there")))
;; received hi
;; received there
待ち受けるチャネル
alts!
一度に複数のチャネルから待ち受ける
(let [c1 (chan)
c2 (chan)]
(go (while true
(let [[v ch] (alts! [c1 c2])]
(println “received" v))))
(go (>! c1 "hi"))
(go (>! c2 "there")))
;; received hi
;; received there
待ち受けるチャネル
受信した値と受信元のチャネルが返る
alts! + timeout
受信を待ち受ける時間にタイムアウトを設定
(go
(let [c (chan)
begin (System/currentTimeMillis)]
(alts! [c (timeout 100)])
(println "Gave up after”
(- (System/currentTimeMillis)
begin)))
バッファいろいろ
buffer
一杯になったらパーク or ブロック
dropping-buffer
一杯になったら追加しようとした値をドロップ
sliding-buffer
一杯になったら最初に追加した値をドロップ
ちょっと進んだトピック
ちょっと進んだトピック
チャネル間の連携
高レベルAPI
deprecated API vs transducers
チャネル間の連携
pipe
mult/tap
pub/sub mix/admix
値を振り分ける“トピック”を
あらかじめ指定しておく
高レベルAPI
チャネルによる値の送受信をClojure標準のシー
ケンス処理にみなしたAPI
内部でgoマクロを利用してチャネル間での値の
受け渡しを勝手にやってくれる
高レベルAPIを組み合わせることでgoマクロを
使った低レベルな記述をする機会を減らせる
高レベルAPI
その他、into, merge, reduce, take 等が用意
されている
(defn split [p ch]
(let [tc (chan), fc (chan)]
(go (loop []
(let [v (<! ch)]
(if (nil? v)
(do (close! tc) (close! fc))
(when (>! (if (p v) tc fc) v)
(recur))))))
[tc fc]))
c.c.a/splitの定義(一部簡略化)
deprecated API vs transducers
高レベルAPIで提供されるような、チャネルか
ら得られる値を加工したいケースは多い
channel ??? channel
deprecated API vs transducers
core.asyncではチャネル用のmapやfilterも提
供していた
(let [ch (to-chan (range))]
[(<!! ch) (<!! ch) (<!! ch)])
;=> [0 1 2]
(let [ch (->> (to-chan (range))
(map< inc)
(map< #(* % %)))]
[(<!! ch) (<!! ch) (<!! ch)])
;=> [1 4 9]
deprecated API vs transducers
Clojure 1.7以降ではtransducerを使って同様の処理が書ける
チャネル生成時にtransducerを指定するとチャネルから取得
できる値はtransducerを適用した結果の値になる
(let [xform (comp (map inc)
(map #(* % %)))
ch (pipe (to-chan (range))
(chan 1 xform))]
[(<!! ch) (<!! ch) (<!! ch)])
;=> [1 4 9]
transducer
まとめ
core.asyncはチャネルベースの非同期プログラ
ミング用ライブラリ
goマクロを使うことで協調スレッドが利用でき
ClojureScriptでも並行に動くタスクを記述可能
1 of 38

Recommended

入門Transducers by
入門Transducers入門Transducers
入門Transducerssohta
3.7K views59 slides
Clojureの世界と実際のWeb開発 by
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Tsutomu Yano
40.2K views54 slides
ふつうのcore.async by
ふつうのcore.asyncふつうのcore.async
ふつうのcore.asyncTsutomu Yano
1.8K views43 slides
正しいものを正しくつくるへ至る道 by
正しいものを正しくつくるへ至る道正しいものを正しくつくるへ至る道
正しいものを正しくつくるへ至る道toshihiro ichitani
5.6K views55 slides
キメるClojure by
キメるClojureキメるClojure
キメるClojureYoshitaka Kawashima
7.8K views33 slides
Akkaとは。アクターモデル とは。 by
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
7.8K views49 slides

More Related Content

What's hot

オブジェクト指向できていますか? by
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
237.5K views129 slides
Spectacular Future with clojure.spec by
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.specKent Ohashi
2.7K views47 slides
LinuxのFull ticklessを試してみた by
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたHiraku Toyooka
10.5K views19 slides
トランザクションをSerializableにする4つの方法 by
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
21.9K views47 slides
Constexpr 中3女子テクニック by
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
33K views138 slides
TLS, HTTP/2演習 by
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習shigeki_ohtsu
13.1K views129 slides

What's hot(20)

オブジェクト指向できていますか? by Moriharu Ohzu
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu237.5K views
Spectacular Future with clojure.spec by Kent Ohashi
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
Kent Ohashi2.7K views
LinuxのFull ticklessを試してみた by Hiraku Toyooka
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみた
Hiraku Toyooka10.5K views
トランザクションをSerializableにする4つの方法 by Kumazaki Hiroki
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki21.9K views
Constexpr 中3女子テクニック by Genya Murakami
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami33K views
インタフェース完全に理解した by torisoup
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
torisoup6K views
20分くらいでわかった気分になれるC++20コルーチン by yohhoy
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy13K views
Dockerfileを改善するためのBest Practice 2019年版 by Masahito Zembutsu
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu63.7K views
会社でClojure使ってみて分かったこと by Recruit Technologies
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用 by Life Robotics
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
Life Robotics1.4K views
Goの時刻に関するテスト by Kentaro Kawano
Goの時刻に関するテストGoの時刻に関するテスト
Goの時刻に関するテスト
Kentaro Kawano3.2K views
ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜 by toshihiro ichitani
ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜 ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜
ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜
toshihiro ichitani11.4K views
Halide による画像処理プログラミング入門 by Fixstars Corporation
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Fixstars Corporation15.5K views
DeNAの大規模ライブ配信基盤を支える技術 by DeNA
DeNAの大規模ライブ配信基盤を支える技術DeNAの大規模ライブ配信基盤を支える技術
DeNAの大規模ライブ配信基盤を支える技術
DeNA38.7K views
Python製BDDツールで自動化してみた by KeijiUehata1
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
KeijiUehata113.7K views
中3女子でもわかる constexpr by Genya Murakami
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami49K views

Viewers also liked

言語設計者が意味論を書くときに考えていたこと by
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたことTaku Miyakawa
4K views11 slides
KotlinJSって正直どうなん by
KotlinJSって正直どうなんKotlinJSって正直どうなん
KotlinJSって正直どうなんHiroshi Kikuchi
4K views28 slides
Polyglot on the JVM with Graal (Japanese) by
Polyglot on the JVM with Graal (Japanese)Polyglot on the JVM with Graal (Japanese)
Polyglot on the JVM with Graal (Japanese)Logico
3.2K views91 slides
Jvm言語とJava、切っても切れないその関係 by
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係yy yank
9.7K views93 slides
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの? by
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?Takakiyo Tanaka
1.1K views35 slides
Graph Algorithms Part 1 by
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1Taku Miyakawa
882 views57 slides

Viewers also liked(20)

言語設計者が意味論を書くときに考えていたこと by Taku Miyakawa
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa4K views
Polyglot on the JVM with Graal (Japanese) by Logico
Polyglot on the JVM with Graal (Japanese)Polyglot on the JVM with Graal (Japanese)
Polyglot on the JVM with Graal (Japanese)
Logico 3.2K views
Jvm言語とJava、切っても切れないその関係 by yy yank
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
yy yank9.7K views
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの? by Takakiyo Tanaka
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Takakiyo Tanaka1.1K views
Open Liberty: オープンソースになったWebSphere Liberty by Takakiyo Tanaka
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka6.1K views
2017spring jjug ccc_f2 by Kazuhiro Wada
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2
Kazuhiro Wada9.9K views
Jjugccc2017spring-postgres-ccc_m1 by Kosuke Kida
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
Kosuke Kida7.8K views
Arachne Unweaved (JP) by Ikuru Kanuma
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)
Ikuru Kanuma5.5K views
VMの歩む道。 Dalvik、ART、そしてJava VM by yy yank
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank14.5K views
U-NEXT学生インターン、過激なJavaの学び方と過激な要求 by hajime funaki
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
hajime funaki7.6K views
Java libraries you can't afford to miss by Andres Almiray
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
Andres Almiray12K views
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~ by Hiroyuki Ohnaka
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Hiroyuki Ohnaka10.3K views
Kotlin is charming; The reasons Java engineers should start Kotlin. by JustSystems Corporation
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
SpotBugs(FindBugs)による 大規模ERPのコード品質改善 by Works Applications
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Works Applications14K views
Polyglot on the JVM with Graal (English) by Logico
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
Logico 5.4K views

More from sohta

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの by
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものsohta
10K views21 slides
Clojure Language Update (2015) by
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)sohta
1.4K views16 slides
入門ClojureScript by
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
3.3K views12 slides
プログラミング言語Clojureのニャンパスでの活用事例 by
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
13.6K views34 slides
REPLライフをもっと快適に by
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適にsohta
14.6K views21 slides
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター by
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターsohta
2.9K views56 slides

More from sohta(9)

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの by sohta
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta10K views
Clojure Language Update (2015) by sohta
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)
sohta1.4K views
入門ClojureScript by sohta
入門ClojureScript入門ClojureScript
入門ClojureScript
sohta3.3K views
プログラミング言語Clojureのニャンパスでの活用事例 by sohta
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
sohta13.6K views
REPLライフをもっと快適に by sohta
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適に
sohta14.6K views
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター by sohta
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta2.9K views
ClojureではじめるSTM入門 by sohta
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門
sohta6.5K views
Macros in Clojure by sohta
Macros in ClojureMacros in Clojure
Macros in Clojure
sohta3.9K views
Clojureによるバイトコードプログラミング by sohta
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
sohta1.6K views

入門core.async