Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
19k
Inside SWOOLE: 非同期処理はどのようにして動くのか/inside_swoole
KOYAMA Tetsuji
February 09, 2020
Tweet
Share
More Decks by KOYAMA Tetsuji
See All by KOYAMA Tetsuji
PIE (PHP Installer for Extensions) をみんなで試そう/piseka-pie
koyhoge
0
88
君はPostScriptなウィンドウシステム 「NeWS」をご存知か?/sunnews
koyhoge
0
930
全日本PHPカンファレンス2024スタンプラリーについて/stamprally-php2024
koyhoge
0
180
日本PHPカンファレンス2024スタンプラリーとその実装/phpcon-stamprally
koyhoge
1
1.8k
日本のPHPカンファレンスの歩みと、その辺もろもろ/phpcon_japan_history
koyhoge
0
300
映画を年300本観る技術/watch_300_movies_in_a_year
koyhoge
0
1.3k
Swooleで実装するPHP非同期処理の世界/phpcondo2019-swoole
koyhoge
3
5.6k
CloudFormation と FaaS のはざま - Kubernetes の設計思想を探る -/cf-faas-k8s
koyhoge
0
1.5k
ITイベントマニアから見る技術イベントの動向/techevent
koyhoge
0
320
Other Decks in Programming
See All in Programming
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
260
マスタデータ問題、マイクロサービスでどう解くか
kts
0
110
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
130
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
380
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.9k
Navigating Dependency Injection with Metro
l2hyunwoo
1
150
Deno Tunnel を使ってみた話
kamekyame
0
160
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
250
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
870
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
780
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
390
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
87
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Done Done
chrislema
186
16k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
23
Ruling the World: When Life Gets Gamed
codingconduct
0
92
Believing is Seeing
oripsolob
0
10
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.7k
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