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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
310
「人を評価する AI」の設計と実装
ryoyanara
0
260
ALB ログから Trace を気合で繋げる技術
fohte
7
770
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
570
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
3.8k
FastAPI の並行処理モデルを完全に理解する
hoto17296
8
3.1k
Hono + Inertia + React で LP を構築した話
oukayuka
2
180
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.9k
Cloudflare is Agents
chimame
0
180
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
270
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
390
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
3
3.8k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Deep Space Network (abreviated)
tonyrice
0
270
Documentation Writing (for coders)
carmenintech
77
5.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
300
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
790
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
260
Building Adaptive Systems
keathley
44
3.2k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
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