Submit Search
Upload
入門core.async
•
3 likes
•
2,712 views
S
sohta
Follow
2015/4/19に開催されたcore.async勉強会の入門セッション用資料です。
Read less
Read more
Software
Report
Share
Report
Share
1 of 38
Download now
Download to read offline
Recommended
ふつうのcore.async
ふつうのcore.async
Tsutomu Yano
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
入門Transducers
入門Transducers
sohta
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
Recommended
ふつうのcore.async
ふつうのcore.async
Tsutomu Yano
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
入門Transducers
入門Transducers
sohta
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
Kazuaki Ishizaki
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
Tomoaki Uchida
Spectacular Future with clojure.spec
Spectacular Future with clojure.spec
Kent Ohashi
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
SPAのルーティングの話
SPAのルーティングの話
ushiboy
Format string Attack
Format string Attack
icchy
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
Lisperの見る世界
Lisperの見る世界
fukamachi
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
async/await のしくみ
async/await のしくみ
信之 岩永
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa
KotlinJSって正直どうなん
KotlinJSって正直どうなん
Hiroshi Kikuchi
More Related Content
What's hot
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
Kazuaki Ishizaki
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
Tomoaki Uchida
Spectacular Future with clojure.spec
Spectacular Future with clojure.spec
Kent Ohashi
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
SPAのルーティングの話
SPAのルーティングの話
ushiboy
Format string Attack
Format string Attack
icchy
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
Lisperの見る世界
Lisperの見る世界
fukamachi
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
async/await のしくみ
async/await のしくみ
信之 岩永
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
What's hot
(20)
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
WebSocketのキホン
WebSocketのキホン
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
Spectacular Future with clojure.spec
Spectacular Future with clojure.spec
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
SPAのルーティングの話
SPAのルーティングの話
Format string Attack
Format string Attack
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
Lisperの見る世界
Lisperの見る世界
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
async/await のしくみ
async/await のしくみ
分散システムについて語らせてくれ
分散システムについて語らせてくれ
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Viewers also liked
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
Taku Miyakawa
KotlinJSって正直どうなん
KotlinJSって正直どうなん
Hiroshi Kikuchi
Polyglot on the JVM with Graal (Japanese)
Polyglot on the JVM with Graal (Japanese)
Logico
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
yy yank
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Takakiyo Tanaka
Graph Algorithms Part 1
Graph Algorithms Part 1
Taku Miyakawa
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka
2017spring jjug ccc_f2
2017spring jjug ccc_f2
Kazuhiro Wada
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
Kosuke Kida
Arachne Unweaved (JP)
Arachne Unweaved (JP)
Ikuru Kanuma
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
hajime funaki
Java libraries you can't afford to miss
Java libraries you can't afford to miss
Andres Almiray
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Hiroyuki Ohnaka
Jjug ccc
Jjug ccc
Tanaka Yuichi
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
JustSystems Corporation
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Works Applications
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
Logico
Introduction of Project Jigsaw
Introduction of Project Jigsaw
Yuichi Sakuraba
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
Viewers also liked
(20)
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
KotlinJSって正直どうなん
KotlinJSって正直どうなん
Polyglot on the JVM with Graal (Japanese)
Polyglot on the JVM with Graal (Japanese)
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
クラウド、クラウドというけれどJavaのシステムにとってクラウドってメリットあるの?
Graph Algorithms Part 1
Graph Algorithms Part 1
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
2017spring jjug ccc_f2
2017spring jjug ccc_f2
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
Arachne Unweaved (JP)
Arachne Unweaved (JP)
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
Java libraries you can't afford to miss
Java libraries you can't afford to miss
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Jjug ccc
Jjug ccc
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
Introduction of Project Jigsaw
Introduction of Project Jigsaw
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
More from sohta
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta
Clojure Language Update (2015)
Clojure Language Update (2015)
sohta
入門ClojureScript
入門ClojureScript
sohta
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
sohta
REPLライフをもっと快適に
REPLライフをもっと快適に
sohta
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta
ClojureではじめるSTM入門
ClojureではじめるSTM入門
sohta
Macros in Clojure
Macros in Clojure
sohta
Clojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
sohta
More from sohta
(9)
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojure Language Update (2015)
Clojure Language Update (2015)
入門ClojureScript
入門ClojureScript
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
REPLライフをもっと快適に
REPLライフをもっと快適に
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
ClojureではじめるSTM入門
ClojureではじめるSTM入門
Macros in Clojure
Macros in Clojure
Clojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
入門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でも並行に動くタスクを記述可能
Download now