SlideShare a Scribd company logo
入門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でも並行に動くタスクを記述可能

More Related Content

PPTX
ふつうのcore.async
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Springを何となく使ってる人が抑えるべきポイント
PDF
暗号技術の実装と数学
PDF
ヤフー発のメッセージキュー「Pulsar」のご紹介
PPTX
GraphQLのsubscriptionで出来ること
PDF
WebSocketのキホン
PPTX
Continuous Architecture and Emergent Design: Disciplined Agile Strategies
ふつうのcore.async
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
Springを何となく使ってる人が抑えるべきポイント
暗号技術の実装と数学
ヤフー発のメッセージキュー「Pulsar」のご紹介
GraphQLのsubscriptionで出来ること
WebSocketのキホン
Continuous Architecture and Emergent Design: Disciplined Agile Strategies

What's hot (20)

PDF
pg_trgmと全文検索
PPTX
グラフデータベース入門
PDF
目grep入門 +解説
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
Apache Avro vs Protocol Buffers
PDF
キメるClojure
PDF
Swagger 入門
PDF
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
PDF
異次元のグラフデータベースNeo4j
PDF
Java仮想マシンの実装技術
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
すごい配列楽しく学ぼう
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
Pythonによる黒魔術入門
PPTX
ChatGPTでモノづくりを支援してもらった話(移行済)
PDF
Mavenの真実とウソ
PDF
pg_bigmを触り始めた人に伝えたいこと
PDF
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PDF
AWS Black Belt Online Seminar Amazon Aurora
pg_trgmと全文検索
グラフデータベース入門
目grep入門 +解説
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Apache Avro vs Protocol Buffers
キメるClojure
Swagger 入門
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
異次元のグラフデータベースNeo4j
Java仮想マシンの実装技術
ヤフー社内でやってるMySQLチューニングセミナー大公開
すごい配列楽しく学ぼう
入社1年目のプログラミング初心者がSpringを学ぶための手引き
Pythonによる黒魔術入門
ChatGPTでモノづくりを支援してもらった話(移行済)
Mavenの真実とウソ
pg_bigmを触り始めた人に伝えたいこと
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
AWS Black Belt Online Seminar Amazon Aurora
Ad

Viewers also liked (20)

PDF
言語設計者が意味論を書くときに考えていたこと
PDF
KotlinJSって正直どうなん
PDF
Polyglot on the JVM with Graal (Japanese)
PDF
Jvm言語とJava、切っても切れないその関係
PDF
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
PDF
Graph Algorithms Part 1
PDF
Open Liberty: オープンソースになったWebSphere Liberty
PDF
2017spring jjug ccc_f2
PDF
Jjugccc2017spring-postgres-ccc_m1
PDF
Arachne Unweaved (JP)
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
PPTX
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
PDF
Java libraries you can't afford to miss
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
PPTX
Jjug ccc
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
PDF
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
PDF
Polyglot on the JVM with Graal (English)
PDF
Introduction of Project Jigsaw
PDF
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
言語設計者が意味論を書くときに考えていたこと
KotlinJSって正直どうなん
Polyglot on the JVM with Graal (Japanese)
Jvm言語とJava、切っても切れないその関係
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Graph Algorithms Part 1
Open Liberty: オープンソースになったWebSphere Liberty
2017spring jjug ccc_f2
Jjugccc2017spring-postgres-ccc_m1
Arachne Unweaved (JP)
VMの歩む道。 Dalvik、ART、そしてJava VM
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
Java libraries you can't afford to miss
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Jjug ccc
Kotlin is charming; The reasons Java engineers should start Kotlin.
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Polyglot on the JVM with Graal (English)
Introduction of Project Jigsaw
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Ad

More from sohta (10)

PDF
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
PDF
入門Transducers
PDF
Clojure Language Update (2015)
PDF
入門ClojureScript
PDF
プログラミング言語Clojureのニャンパスでの活用事例
PDF
REPLライフをもっと快適に
PDF
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
PDF
ClojureではじめるSTM入門
PDF
Macros in Clojure
PDF
Clojureによるバイトコードプログラミング
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
入門Transducers
Clojure Language Update (2015)
入門ClojureScript
プログラミング言語Clojureのニャンパスでの活用事例
REPLライフをもっと快適に
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
ClojureではじめるSTM入門
Macros in Clojure
Clojureによるバイトコードプログラミング

入門core.async