Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
並列処理で消耗しているかたへ - Snidel のご紹介 -
Search
Akihito Nakano
July 20, 2016
Programming
3.6k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
並列処理で消耗しているかたへ - Snidel のご紹介 -
Akihito Nakano
July 20, 2016
More Decks by Akihito Nakano
See All by Akihito Nakano
OpenAPI Generator Meetup #1
akihito_nakano
1
1.5k
Libraの現状と技術面をざっくりと / astudy20191114
akihito_nakano
4
1.2k
カート刷新プロジェクトにおけるOpenAPIを活用したコード自動生成の今と明日 / astudy20190419
akihito_nakano
2
700
平静を保ち、コードを生成せよ 〜 OpenAPI Generator誕生の背景と軌跡 〜 / gunmaweb34
akihito_nakano
25
57k
プライベートAPIのクライアントをいい感じにしたい / pepabo_ec_tech_mtg02
akihito_nakano
0
2k
サーキットブレーカー 〜 有料契約店舗数 国内 No.1 ECサービスに神を宿す 〜 / pepabo_ec_tech_mtg01
akihito_nakano
1
4.6k
並行・並列処理のテストは難しい
akihito_nakano
2
5k
Other Decks in Programming
See All in Programming
信頼性の目標を誰も求めてない
shubox
0
230
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
450
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
160
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
740
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.3k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
270
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
570
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
460
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
780
Press start. Python's next generation.
willingc
PRO
3
250
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
110
Featured
See All Featured
Leo the Paperboy
mayatellez
8
2.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
480
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Six Lessons from altMBA
skipperchong
29
4.5k
Building the Perfect Custom Keyboard
takai
2
850
Making Projects Easy
brettharned
120
6.7k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
300
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
What's in a price? How to price your products and services
michaelherold
247
13k
Music & Morning Musume
bryan
47
7.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Transcript
4OJEFMͷ͝հ தڿਓ(.01&1"#0JOD 1)1#-5 ฒྻॲཧͰফ͍ͯ͠Δ͔ͨ
8&#ΞϓϦέʔγϣϯΤϯδχΞ άϯϚʔ தڿਓ ͖͋ͬʔ !/","/0@"LJIJUP &$ࣄۀ෦Χϥʔϛʔγϣοϓάϧʔϓ IUUQBDLJOUPTIHJUIVCJP
Χϥʔϛʔγϣοϓ
ফ͍ͯ͠·ͤΜ͔ʁ
None
None
ऴΘΒͳ͍
ύϥͰ࣮ߦ͍ͨ͠
Ͳ͏͢Δ wDVSM@NVMUJ wQDOUM@GPSL wQUISFBE֦ு wόοΫάϥϯυ wλεΫΩϡʔΠϯά wଞͷݴޠΛซ༻͢Δ wଞͷݴޠͰॻ͖ͳ͓͢ ʜ
ΘΓͱݫ͍͠
4OJEFMͷ͝հ
4OJEFM εφΠσϧ IUUQTHJUIVCDPNBDLJOUPTITOJEFM खܰʹϚϧνϓϩηεͰ͖Δ ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ ϚελʔʗϫʔΧʔϞσϧ 1)1Ҏ্
खܰʹϚϧνϓϩηεͰ͖Δ
खܰʹϚϧνϓϩηεͰ͖Δ $snidel = new Snidel($concurrency = 5);
खܰʹϚϧνϓϩηεͰ͖Δ $snidel = new Snidel($concurrency = 5); $sleep = function
() { sleep(3); };
खܰʹϚϧνϓϩηεͰ͖Δ $snidel = new Snidel($concurrency = 5); $sleep = function
() { sleep(3); }; $snidel->fork($sleep); $snidel->fork($sleep);
खܰʹϚϧνϓϩηεͰ͖Δ $snidel = new Snidel($concurrency = 5); $sleep = function
() { sleep(3); }; $snidel->fork($sleep); $snidel->fork($sleep); $snidel->wait();
खܰʹϚϧνϓϩηεͰ͖Δ $snidel = new Snidel($concurrency = 5); $sleep = function
() { sleep(3); }; $snidel->fork($sleep); $snidel->fork($sleep); $snidel->wait();// 3ඵͰ͓ΘΔ
खܰʹϚϧνϓϩηεͰ͖Δ // ແ໊ؔ $snidel->fork($f, ‘arg'); // άϩʔόϧؔ $snidel->fork('strtoupper', ‘php’); //
Πϯελϯεϝιου $snidel->fork([$instance, ‘method’], [‘arg1’, ’arg2’]); // ελςΟοΫϝιου $snidel->fork([‘\FooClass’, ‘method’], [‘arg1’, ’arg2’]);
DBMM@VTFS@GVOD@BSSBZͱ ΄΅ ಉ͡
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ $f = function ($arg) { return $arg; };
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ $f = function ($arg) { return $arg; }; $snidel->fork($f,
'foo'); $snidel->fork($f, 'bar'); $snidel->fork($f, 'baz');
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ $f = function ($arg) { return $arg; }; $snidel->fork($f,
'foo'); $snidel->fork($f, 'bar'); $snidel->fork($f, 'baz'); var_dump($snidel->get()->toArray());
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ $f = function ($arg) { return $arg; }; $snidel->fork($f,
'foo'); $snidel->fork($f, 'bar'); $snidel->fork($f, 'baz'); var_dump($snidel->get()->toArray()); array(3) { [0] => string(3) "bar" [1] => string(3) “foo" [2] => string(3) "baz" }
ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ $f = function ($arg) { return $arg; }; $snidel->fork($f,
'foo'); $snidel->fork($f, 'bar'); $snidel->fork($f, 'baz'); var_dump($snidel->get()->toArray()); array(3) { [0] => string(3) "bar" [1] => string(3) “foo" [2] => string(3) "baz" } ˞݁Ռͷॱংอূ͞Εͳ͍
λά͚͢Δ
ॲཧ݁ՌΛλά͚͢Δ // ୈ̏ҾʹλάΛࢦఆ͢Δ $snidel->fork($f, ‘foo’, ‘tag1’); $snidel->fork($f, ‘bar’, ‘tag1’); $snidel->fork($f,
‘baz’, ‘tag2’);
ॲཧ݁ՌΛλά͚͢Δ // ୈ̏ҾʹλάΛࢦఆ͢Δ $snidel->fork($f, ‘foo’, ‘tag1’); $snidel->fork($f, ‘bar’, ‘tag1’); $snidel->fork($f,
‘baz’, ‘tag2’); var_dump($snidel->get('tag1')->toArray());
ॲཧ݁ՌΛλά͚͢Δ // ୈ̏ҾʹλάΛࢦఆ͢Δ $snidel->fork($f, ‘foo’, ‘tag1’); $snidel->fork($f, ‘bar’, ‘tag1’); $snidel->fork($f,
‘baz’, ‘tag2’); var_dump($snidel->get('tag1')->toArray()); array(2) { [0]=> string(3) "foo" [1]=> string(3) "bar" }
ͦͷଞͷػೳ
ͦͷଞͷػೳ ϩά $fp = fopen('php://stdout', ‘w’); $snidel->setLogDestination($fp); $snidel->fork($f);
ͦͷଞͷػೳ ϩά $fp = fopen('php://stdout', ‘w’); $snidel->setLogDestination($fp); $snidel->fork($f); [2016-07-20 20:00:00][info][29688(owner)]
pid: 29688 [2016-07-20 20:00:00][info][29689(master)] pid: 29689 [2016-07-20 20:00:00][info][29688(owner)] queued task #1 [2016-07-20 20:00:00][info][29688(owner)] queued task #2 [2016-07-20 20:00:00][info][29689(master)] dequeued task #1 [2016-07-20 20:00:00][info][29689(master)] forked worker. pid: 29690
ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’,
'ggg'];
ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’,
'ggg']; $snidel = new Snidel($concurrency = 2);
ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’,
'ggg']; $snidel = new Snidel($concurrency = 2); $camelize = $snidel->map($args, function ($arg) { /** ॲཧ1 */ return explode(' ', strtolower($arg)); })->then(function ($result) { /** ॲཧ2 */ return array_map('ucfirst', $result->getReturn()); })->then(function ($result) { /** ॲཧ3 */ return implode('', $result->getReturn()); });
ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’,
'ggg']; $snidel = new Snidel($concurrency = 2); $camelize = $snidel->map($args, function ($arg) { /** ॲཧ1 */ return explode(' ', strtolower($arg)); })->then(function ($result) { /** ॲཧ2 */ return array_map('ucfirst', $result->getReturn()); })->then(function ($result) { /** ॲཧ3 */ return implode('', $result->getReturn()); }); var_dump($snidel->run($camelize));
ಈ࡞Πϝʔδ IUUQTWJNFPDPN
ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’,
'ggg']; $snidel = new Snidel($concurrency = 2); $camelize = $snidel->map($args, function ($arg) { /** ॲཧ1 */ return explode(' ', strtolower($arg)); })->then(function ($result) { /** ॲཧ2 */ return array_map('ucfirst', $result->getReturn()); })->then(function ($result) { /** ॲཧ3 */ return implode('', $result->getReturn()); }); var_dump($snidel->run($camelize)); ࣍ͷόʔδϣϯͰআ༧ఆ ݸผͷϥΠϒϥϦʹ
·ͱΊ
ฒྻॲཧͰফ͍ͯ͠Δਓ Snidel ΛͬͨΒͤʹͳΕΔ͔
ϓϧϦΫΤετܴʂ IUUQTHJUIVCDPNBDLJOUPTITOJEFM
܅ϖύϘͰಇ͔ͳ͍͔ʁ ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU
None