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.4k
Libraの現状と技術面をざっくりと / astudy20191114
akihito_nakano
4
1.2k
カート刷新プロジェクトにおけるOpenAPIを活用したコード自動生成の今と明日 / astudy20190419
akihito_nakano
2
670
平静を保ち、コードを生成せよ 〜 OpenAPI Generator誕生の背景と軌跡 〜 / gunmaweb34
akihito_nakano
25
57k
プライベートAPIのクライアントをいい感じにしたい / pepabo_ec_tech_mtg02
akihito_nakano
0
1.9k
サーキットブレーカー 〜 有料契約店舗数 国内 No.1 ECサービスに神を宿す 〜 / pepabo_ec_tech_mtg01
akihito_nakano
1
4.6k
並行・並列処理のテストは難しい
akihito_nakano
2
4.9k
Other Decks in Programming
See All in Programming
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
どこまでゆるくて許されるのか
tk3fftk
0
500
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
100
霧の中の代数的エフェクト
funnyycat
1
400
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
580
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
330
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.4k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
280
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
380
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
950
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
260
Featured
See All Featured
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
420
The browser strikes back
jonoalderson
0
1.4k
30 Presentation Tips
portentint
PRO
1
350
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
310
Embracing the Ebb and Flow
colly
88
5.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
Crafting Experiences
bethany
1
220
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
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