SlideShare a Scribd company logo
Submit Search
Upload
入門core.async
Report
Share
S
sohta
Follow
•
3 likes
•
2,707 views
1
of
38
入門core.async
•
3 likes
•
2,707 views
Report
Share
Download Now
Download to read offline
Software
2015/4/19に開催されたcore.async勉強会の入門セッション用資料です。
Read more
S
sohta
Follow
Recommended
入門Transducers by
入門Transducers
sohta
3.7K views
•
59 slides
Clojureの世界と実際のWeb開発 by
Clojureの世界と実際のWeb開発
Tsutomu Yano
40.2K views
•
54 slides
ふつうのcore.async by
ふつうのcore.async
Tsutomu Yano
1.8K views
•
43 slides
正しいものを正しくつくるへ至る道 by
正しいものを正しくつくるへ至る道
toshihiro ichitani
5.6K views
•
55 slides
キメるClojure by
キメるClojure
Yoshitaka Kawashima
7.8K views
•
33 slides
Akkaとは。アクターモデル とは。 by
Akkaとは。アクターモデル とは。
Kenjiro Kubota
7.8K views
•
49 slides
More Related Content
What's hot
オブジェクト指向できていますか? by
オブジェクト指向できていますか?
Moriharu Ohzu
237.5K views
•
129 slides
Spectacular Future with clojure.spec by
Spectacular Future with clojure.spec
Kent Ohashi
2.7K views
•
47 slides
LinuxのFull ticklessを試してみた by
LinuxのFull ticklessを試してみた
Hiraku Toyooka
10.5K views
•
19 slides
トランザクションをSerializableにする4つの方法 by
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
21.9K views
•
47 slides
Constexpr 中3女子テクニック by
Constexpr 中3女子テクニック
Genya Murakami
33K views
•
138 slides
TLS, HTTP/2演習 by
TLS, HTTP/2演習
shigeki_ohtsu
13.1K views
•
129 slides
What's hot
(20)
オブジェクト指向できていますか? by Moriharu Ohzu
オブジェクト指向できていますか?
Moriharu Ohzu
•
237.5K views
Spectacular Future with clojure.spec by Kent Ohashi
Spectacular Future with clojure.spec
Kent Ohashi
•
2.7K views
LinuxのFull ticklessを試してみた by Hiraku Toyooka
LinuxのFull ticklessを試してみた
Hiraku Toyooka
•
10.5K views
トランザクションをSerializableにする4つの方法 by Kumazaki Hiroki
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
•
21.9K views
Constexpr 中3女子テクニック by Genya Murakami
Constexpr 中3女子テクニック
Genya Murakami
•
33K views
TLS, HTTP/2演習 by shigeki_ohtsu
TLS, HTTP/2演習
shigeki_ohtsu
•
13.1K views
インタフェース完全に理解した by torisoup
インタフェース完全に理解した
torisoup
•
6K views
20分くらいでわかった気分になれるC++20コルーチン by yohhoy
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
•
13K views
Dockerfileを改善するためのBest Practice 2019年版 by Masahito Zembutsu
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
•
63.7K views
会社でClojure使ってみて分かったこと by Recruit Technologies
会社でClojure使ってみて分かったこと
Recruit Technologies
•
8.7K views
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用 by Life Robotics
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
Life Robotics
•
1.4K views
Goの時刻に関するテスト by Kentaro Kawano
Goの時刻に関するテスト
Kentaro Kawano
•
3.2K views
ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜 by toshihiro ichitani
ともに考え、ともにつくる 〜リーン・ジャーニー・スタイル〜
toshihiro ichitani
•
11.4K views
Halide による画像処理プログラミング入門 by Fixstars Corporation
Halide による画像処理プログラミング入門
Fixstars Corporation
•
15.5K views
DeNAの大規模ライブ配信基盤を支える技術 by DeNA
DeNAの大規模ライブ配信基盤を支える技術
DeNA
•
38.7K views
集約署名 by MITSUNARI Shigeo
集約署名
MITSUNARI Shigeo
•
2.5K views
Lockfree Queue by Kumazaki Hiroki
Lockfree Queue
Kumazaki Hiroki
•
4.7K views
Python製BDDツールで自動化してみた by KeijiUehata1
Python製BDDツールで自動化してみた
KeijiUehata1
•
13.7K views
中3女子でもわかる constexpr by Genya Murakami
中3女子でもわかる constexpr
Genya Murakami
•
49K views
Flutter移行の苦労と、乗り越えた先に得られたもの by Recruit Lifestyle Co., Ltd.
Flutter移行の苦労と、乗り越えた先に得られたもの
Recruit Lifestyle Co., Ltd.
•
6.4K views
Viewers also liked
言語設計者が意味論を書くときに考えていたこと by
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa
4K views
•
11 slides
KotlinJSって正直どうなん by
KotlinJSって正直どうなん
Hiroshi Kikuchi
4K views
•
28 slides
Polyglot on the JVM with Graal (Japanese) by
Polyglot on the JVM with Graal (Japanese)
Logico
3.2K views
•
91 slides
Jvm言語とJava、切っても切れないその関係 by
Jvm言語とJava、切っても切れないその関係
yy yank
9.7K views
•
93 slides
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの? by
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Takakiyo Tanaka
1.1K views
•
35 slides
Graph Algorithms Part 1 by
Graph Algorithms Part 1
Taku Miyakawa
882 views
•
57 slides
Viewers also liked
(20)
言語設計者が意味論を書くときに考えていたこと by Taku Miyakawa
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa
•
4K views
KotlinJSって正直どうなん by Hiroshi Kikuchi
KotlinJSって正直どうなん
Hiroshi Kikuchi
•
4K views
Polyglot on the JVM with Graal (Japanese) by Logico
Polyglot on the JVM with Graal (Japanese)
Logico
•
3.2K views
Jvm言語とJava、切っても切れないその関係 by yy yank
Jvm言語とJava、切っても切れないその関係
yy yank
•
9.7K views
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの? by Takakiyo Tanaka
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Takakiyo Tanaka
•
1.1K views
Graph Algorithms Part 1 by Taku Miyakawa
Graph Algorithms Part 1
Taku Miyakawa
•
882 views
Open Liberty: オープンソースになったWebSphere Liberty by Takakiyo Tanaka
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka
•
6.1K views
2017spring jjug ccc_f2 by Kazuhiro Wada
2017spring jjug ccc_f2
Kazuhiro Wada
•
9.9K views
Jjugccc2017spring-postgres-ccc_m1 by Kosuke Kida
Jjugccc2017spring-postgres-ccc_m1
Kosuke Kida
•
7.8K views
Arachne Unweaved (JP) by Ikuru Kanuma
Arachne Unweaved (JP)
Ikuru Kanuma
•
5.5K views
VMの歩む道。 Dalvik、ART、そしてJava VM by yy yank
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
•
14.5K views
U-NEXT学生インターン、過激なJavaの学び方と過激な要求 by hajime funaki
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
hajime funaki
•
7.6K views
Java libraries you can't afford to miss by Andres Almiray
Java libraries you can't afford to miss
Andres Almiray
•
12K views
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~ by Hiroyuki Ohnaka
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Hiroyuki Ohnaka
•
10.3K views
Jjug ccc by Tanaka Yuichi
Jjug ccc
Tanaka Yuichi
•
4.2K views
Kotlin is charming; The reasons Java engineers should start Kotlin. by JustSystems Corporation
Kotlin is charming; The reasons Java engineers should start Kotlin.
JustSystems Corporation
•
9.4K views
SpotBugs(FindBugs)による 大規模ERPのコード品質改善 by Works Applications
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Works Applications
•
14K views
Polyglot on the JVM with Graal (English) by Logico
Polyglot on the JVM with Graal (English)
Logico
•
5.4K views
Introduction of Project Jigsaw by Yuichi Sakuraba
Introduction of Project Jigsaw
Yuichi Sakuraba
•
13K views
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2 by Yahoo!デベロッパーネットワーク
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
•
8.4K views
More from sohta
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの by
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta
10K views
•
21 slides
Clojure Language Update (2015) by
Clojure Language Update (2015)
sohta
1.4K views
•
16 slides
入門ClojureScript by
入門ClojureScript
sohta
3.3K views
•
12 slides
プログラミング言語Clojureのニャンパスでの活用事例 by
プログラミング言語Clojureのニャンパスでの活用事例
sohta
13.6K views
•
34 slides
REPLライフをもっと快適に by
REPLライフをもっと快適に
sohta
14.6K views
•
21 slides
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター by
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta
2.9K views
•
56 slides
More from sohta
(9)
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの by sohta
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta
•
10K views
Clojure Language Update (2015) by sohta
Clojure Language Update (2015)
sohta
•
1.4K views
入門ClojureScript by sohta
入門ClojureScript
sohta
•
3.3K views
プログラミング言語Clojureのニャンパスでの活用事例 by sohta
プログラミング言語Clojureのニャンパスでの活用事例
sohta
•
13.6K views
REPLライフをもっと快適に by sohta
REPLライフをもっと快適に
sohta
•
14.6K views
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター by sohta
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta
•
2.9K views
ClojureではじめるSTM入門 by sohta
ClojureではじめるSTM入門
sohta
•
6.5K views
Macros in Clojure by sohta
Macros in Clojure
sohta
•
3.9K views
Clojureによるバイトコードプログラミング by sohta
Clojureによるバイトコードプログラミング
sohta
•
1.6K views
入門core.async
1.
入門core.async core.async勉強会 2015/4/19@HaLake @athos0220
2.
アジェンダ core.asyncとは コアコンセプト 基本的なAPIの使い方 ちょっと進んだトピック
3.
core.asyncとは?
4.
core.asyncとは? 非同期プログラミング用ライブラリ CSPライクなチャネル通信をベースとしている Go言語のgoroutineにインスパイアされたgoブ ロックを提供
5.
コアコンセプト
6.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer channel consumer
7.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer channel consumer
8.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer channel consumer
9.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー
10.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー
11.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー
12.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー
13.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー バッファがいっぱいだったら?
14.
チャネル 並行に動くタスク間で値を受け渡す通信路 producer consumer 実際にはバッファを持ったキュー バッファがいっぱいだったら? バッファが空だったら?
15.
協調スレッド(IOCスレッド) 以下のような場合に制御が別のスレッドに切り替わる 値を受信しようとしたときにバッファが空 値を送信しようとしたときにバッファがいっぱい IOC = Inversion
of Control (go (while true (let [v (<! ch)] (println v)))) (go (loop [i 0] (>! ch i) (recur (inc i))))
16.
協調スレッド(IOCスレッド) 以下のような場合に制御が別のスレッドに切り替わる 値を受信しようとしたときにバッファが空 値を送信しようとしたときにバッファがいっぱい IOC = Inversion
of Control (go (while true (let [v (<! ch)] (println v)))) (go (loop [i 0] (>! ch i) (recur (inc i)))) 上記の場合には が実行されずに制御が切り替わる(パーク)
17.
協調スレッド(IOCスレッド) グリーンスレッド(ネイティブスレッドでない)ので生成の コストが低い シングルスレッドの場合でも使える(ClojureScriptでも!) native thread native
thread native thread IOCthread IOCthread IOCthread IOCthread IOCthread IOCthread IOCthread IOCthread IOCthread
18.
基本的なAPIの使い方
19.
チャネル生成と送受信 チャネル生成:chan 送信:>!, >!! 受信:<!, <!! (let
[ch (chan 2)] (>!! ch 0) (>!! ch 1) [(<!! ch) (<!! ch)]) ;=> [0 1]
20.
チャネル生成と送受信 チャネル生成:chan 送信:>!, >!! 受信:<!, <!! (let
[ch (chan 2)] (>!! ch 0) (>!! ch 1) [(<!! ch) (<!! ch)]) ;=> [0 1] バッファのサイズを指定
21.
チャネル生成と送受信 ブロッキング ノンブロッキング 送信 >!! バッファが一杯ならブロック >! バッファが一杯ならパーク 受信
<!! バッファが空ならブロック <! バッファが空ならパーク
22.
チャネル生成と送受信 ブロッキング ノンブロッキング 送信 >!! バッファが一杯ならブロック >! バッファが一杯ならパーク 受信
<!! バッファが空ならブロック <! バッファが空ならパーク 後述のgoマクロ内でのみ使用可
23.
goマクロ 協調スレッドで処理を実行する (let [ch (chan
2)] (go (while true (let [v (<! ch)] (println “received” v)))) (>!! ch “hi”) (>!! ch “there”)) ;; received hi ;; received there
24.
timeout (let [t (timeout
100) begin (System/currentTimeMillis)] (<!! t) (println “Waited” (- (System/currentTimeMillis) begin))) ;; Waited 100 タイムアウト用のチャネルを生成する
25.
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
26.
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 待ち受けるチャネル
27.
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 待ち受けるチャネル 受信した値と受信元のチャネルが返る
28.
alts! + timeout 受信を待ち受ける時間にタイムアウトを設定 (go (let
[c (chan) begin (System/currentTimeMillis)] (alts! [c (timeout 100)]) (println "Gave up after” (- (System/currentTimeMillis) begin)))
29.
バッファいろいろ buffer 一杯になったらパーク or ブロック dropping-buffer 一杯になったら追加しようとした値をドロップ sliding-buffer 一杯になったら最初に追加した値をドロップ
30.
ちょっと進んだトピック
31.
ちょっと進んだトピック チャネル間の連携 高レベルAPI deprecated API vs
transducers
32.
チャネル間の連携 pipe mult/tap pub/sub mix/admix 値を振り分ける“トピック”を あらかじめ指定しておく
33.
高レベルAPI チャネルによる値の送受信をClojure標準のシー ケンス処理にみなしたAPI 内部でgoマクロを利用してチャネル間での値の 受け渡しを勝手にやってくれる 高レベルAPIを組み合わせることでgoマクロを 使った低レベルな記述をする機会を減らせる
34.
高レベル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の定義(一部簡略化)
35.
deprecated API vs
transducers 高レベルAPIで提供されるような、チャネルか ら得られる値を加工したいケースは多い channel ??? channel
36.
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]
37.
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
38.
まとめ core.asyncはチャネルベースの非同期プログラ ミング用ライブラリ goマクロを使うことで協調スレッドが利用でき ClojureScriptでも並行に動くタスクを記述可能