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
Inside SWOOLE: 非同期処理はどのようにして動くのか/inside_swoole
Search
KOYAMA Tetsuji
February 09, 2020
Programming
0
18k
Inside SWOOLE: 非同期処理はどのようにして動くのか/inside_swoole
KOYAMA Tetsuji
February 09, 2020
Tweet
Share
More Decks by KOYAMA Tetsuji
See All by KOYAMA Tetsuji
全日本PHPカンファレンス2024スタンプラリーについて/stamprally-php2024
koyhoge
0
130
日本PHPカンファレンス2024スタンプラリーとその実装/phpcon-stamprally
koyhoge
1
1.1k
日本のPHPカンファレンスの歩みと、その辺もろもろ/phpcon_japan_history
koyhoge
0
250
映画を年300本観る技術/watch_300_movies_in_a_year
koyhoge
0
1.2k
Swooleで実装するPHP非同期処理の世界/phpcondo2019-swoole
koyhoge
3
5.1k
CloudFormation と FaaS のはざま - Kubernetes の設計思想を探る -/cf-faas-k8s
koyhoge
0
1.4k
ITイベントマニアから見る技術イベントの動向/techevent
koyhoge
0
300
Skaffoldを使ってKubernetes してみた/skaffold_k8s
koyhoge
2
1.3k
東京が大雪の日に何気ない写真がバズった/snow_tree_buzz
koyhoge
0
520
Other Decks in Programming
See All in Programming
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
890
14 Years of iOS: Lessons and Key Points
seyfoyun
1
770
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
760
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
350
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
120
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
600
return文におけるstd::moveについて
onihusube
1
610
快速入門可觀測性
blueswen
0
310
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
250
Featured
See All Featured
A Tale of Four Properties
chriscoyier
157
23k
Navigating Team Friction
lara
183
15k
Designing for Performance
lara
604
68k
Done Done
chrislema
181
16k
Why Our Code Smells
bkeepers
PRO
335
57k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
160
Building Applications with DynamoDB
mza
91
6.1k
Designing Experiences People Love
moore
138
23k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
Faster Mobile Websites
deanohume
305
30k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Transcript
*OTJEF4800-& ඇಉظॲཧͲͷΑ͏ʹͯ͠ ಈ͘ͷ͔ খࢁࢤ !LPZIPHF PHPerKaigi 2020 / 2020-02-09
PHPerKaigi 2020 / 2020-02-09 ࣗݾհ খࢁࢤ ͜·ͯͭ͡ ߹ಉձࣾ΄ٕ͛ݚ Ϣʔβձ͍͔ͭ͘
ຊ6/*9Ϣʔβձ ຊ1PTUHSF42-Ϣʔβձ ຊ1)1Ϣʔβձ SBLVNPגࣜձࣾΤϯδχΞ өըΛ؍Δਓˡ/&8 !LPZIPHF LPZIPHF
PHPerKaigi 2020 / 2020-02-09 1)1ΧϯϑΝϨϯεւಓ ΈΜͳͷ1)1ݱͰཱͭ࠷৽ϊϋ ʮ4XPPMFʹΑΔ1)1ඇಉظॲཧʯ 8&# %#13&44WPM
PHPerKaigi 2020 / 2020-02-09 4XPPMFͱ w1)1ͰඇಉظॲཧΛ࣮ݱ͢Δػೳ֦ு w͔Β։ൃ wݩӳࠃ5SBOTGPOʹΑͬͯ wݱࡏதࠃݍͷ։ൃऀ͕ʹ
PHPerKaigi 2020 / 2020-02-09 ඇಉظॲཧ wฒߦฒྻ wίϧʔνϯ wO݄ؒϥϜμ ϊʔτ WPM
/Pʹৄ͍͠
PHPerKaigi 2020 / 2020-02-09 4XPPMFͷ࣮ݱ๏Λ୳Δ wରຊ ࣌ͷ HJUIVCNBTUFS wW
Ћ
PHPerKaigi 2020 / 2020-02-09 ελʔτ͔͜͜Β go(function() { // something })
PHPerKaigi 2020 / 2020-02-09 HP 473 if (SWOOLE_G(use_shortname)) 474 {
475 SW_FUNCTION_ALIAS(CG(function_table), "swoole_coroutine_create", CG(function_table), "go"); 476 SW_FUNCTION_ALIAS(CG(function_table), "swoole_coroutine_defer", CG(function_table), "defer"); 477 } swoole.cc
PHPerKaigi 2020 / 2020-02-09 TXPPMF@DPSPVUJOF@DSFBUF 931 PHP_FUNCTION(swoole_coroutine_create) 932 { 933
zend_fcall_info fci; 934 zend_fcall_info_cache fci_cache; 935 936 ZEND_PARSE_PARAMETERS_START(1, -1) 937 Z_PARAM_FUNC(fci, fci_cache) 938 Z_PARAM_VARIADIC('*', fci.params, fci.param_count) 939 ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); 940 941 if (sw_unlikely(SWOOLE_G(req_status) == PHP_SWOOLE_CALL_USER_SHUTDOWNFUNC_BEGIN)) swoole_coroutine.cc
PHPerKaigi 2020 / 2020-02-09 951 long cid = PHPCoroutine::create(&fci_cache, fci.param_count,
fci.params); swoole_coroutine.cc
PHPerKaigi 2020 / 2020-02-09 1)1$PSPVUJOFDSFBUF 814 long PHPCoroutine::create(zend_fcall_info_cache *fci_cache, uint32_t
argc, zval *argv) 815 { : 838 php_coro_args php_coro_args; 839 php_coro_args.fci_cache = fci_cache; 840 php_coro_args.argv = argv; 841 php_coro_args.argc = argc; 842 save_task(get_task()); 843 844 return Coroutine::create(main_func, (void*) &php_coro_args); 845 } swoole_coroutine.cc
PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFDSFBUF 121 static inline long create(coroutine_func_t
fn, void* args = nullptr) 122 { 123 return (new Coroutine(fn, args))->run(); 124 } include/coroutine.h
PHPerKaigi 2020 / 2020-02-09 $PSPVUJOF$PSPVUJOF 205 Coroutine(coroutine_func_t fn, void *private_data)
: 206 ctx(stack_size, fn, private_data) 207 { 208 cid = ++last_cid; 209 coroutines[cid] = this; 210 if (sw_unlikely(count() > peak_num)) 211 { 212 peak_num = count(); 213 } 214 } include/coroutine.h
PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFSVO 216 inline long run() 217
{ 218 long cid = this->cid; 219 origin = current; 220 current = this; 221 ctx.swap_in(); 222 check_end(); 223 return cid; 224 } include/coroutine.h
PHPerKaigi 2020 / 2020-02-09 $PSPVUJOFDUY 199 sw_coro_state state = SW_CORO_INIT;
200 long cid; 201 void *task = nullptr; 202 Context ctx; 203 Coroutine *origin; include/coroutine.h
PHPerKaigi 2020 / 2020-02-09 $POUFYUTXBQ@JO 110 bool Context::swap_in() 111 {
112 jump_fcontext(&swap_ctx_, ctx_, (intptr_t) this, true); 113 return true; 114 } src/coroutine/context.cc
PHPerKaigi 2020 / 2020-02-09 KVNQ@GDPOUFYU wTXPPMFTSDʹͳ͍ wCPPTUDPOUFYUͷؔ
PHPerKaigi 2020 / 2020-02-09 CPPTUDPOUFYU •https://github.com/boostorg/ context w$ ͰγϯάϧεϨουϚϧνλεΫ Λ࣮ݱ͢ΔϥΠϒϥϦ
wsetjmp(), longjmp()ͷਐԽ൛
PHPerKaigi 2020 / 2020-02-09 λεΫ͑BTNͰ
PHPerKaigi 2020 / 2020-02-09 ࢀߟਤ w ʲ4XPPMFݯݚڀʳਂೖཧղ4XPPMFླྀఔൌགྷ • https://segmentfault.com/a/1190000019089997
PHPerKaigi 2020 / 2020-02-09 λεΫͲ͏อ࣋͞Ε͍ͯΔ 114 static std::unordered_map<long, Coroutine*> coroutines;
include/coroutine.h
PHPerKaigi 2020 / 2020-02-09 ·ͱΊ w4XPPMFCPPTUDPOUFYUͷλεΫ Λར༻͍ͯ͠Δ wҰݟຐ๏ͷΑ͏ʹݟ͑ͯɺͻͱͭͣ ͭḷ͍ͬͯ͘ͱཧղͰ͖Δ w$
ίϫ͘ͳ͍ΑX