Swoole native curl协程化思路 2020-11-24 Swoole Comments Word Count: 162(words) Read Count: 1(minutes) 这个还是有点复杂的,记录一下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113┌──────────────────────────┐ │ │ │ │ │ co 1 │ │ │ │ 1. curl exec │ │ │ │ │ └──────────────────────────┘ │ │ ▼ ┌──────────────────────────┐ │ │ │ │ │ co 1 │ │ │ │ 2. add timer │ │ │ │ │ └──────────────────────────┘ │ │ ▼ ┌──────────────────────────┐ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ co 1 │ │ event loop │ │ curl_multi_socket_action -> │ │ │────────────────────────────────────▶│ │──────────▶│ connect -> add write event -> │ │ 3. yield_m │ │ 4. timeout │ │ return to event loop │ │ │ │ │ │ │ │ │ │ │ │ │ └──────────────────────────┘ └──────────────────────────────────┘ └──────────────────────────────────┘ │ │ │ ▼ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ │ │ │ │ │ │ event loop │ │ curl_multi_socket_action -> send │ │ │──────────▶│ request -> add read event -> │ │ 5. writeable │ │ return to event loop │ │ │ │ │ │ │ │ │ └──────────────────────────────────┘ └──────────────────────────────────┘ │ │ │ │ │ ▼ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ 6.3 curl_multi_socket_action -> │ │ event loop │ │ 6.1 curl_multi_socket_action -> │ │CURLOPT_WRITEFUNCTION func -> read│ │ │──────────▶│ call CURLOPT_HEADERFUNCTION │─────────▶│body -> delete all event -> delete│ │ 6. readable │ │ │ │ timer -> resume_m │ │ │ │ │ │ │ │ │ │ │ │ │ └──────────────────────────────────┘ └──────────────────────────────────┘ └──────────────────────────────────┘ │ │ │ │ │ │ if set CURLOPT_HEADER│UNCTION in user code │ │ │ │ │ ▼ ▼ ┌──────────────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ │ │ │ │ │ │6.2 set write_header for coroutine│ │ 6.4 read_info -> CURLMSG_DONE -> │ │ -> resume_m │ │ resume_m │ │ │ │ │ │ │ │ │ └──────────────────────────────────┘ │ │ │ └──────────────────────────────────┘ │ │ │ │ │ │ ▼ │ ┌────────────────────────────────────────────┐ │ │ │ │ │ │ │ │ co 1 │ │ │ │ │ │write_header func to get response header -> │ │ │ yield_m (Notice: Every time the │ │ │fn_write_header reads a row of headers in a │ │ │callback, a scheduler-to-coroutine switch is│ │ │ required) │ │ │ │ │ │ why we should call it in coroutine? │ │ │ Because this callback function may have │ │ │ blocking IO │ │ │ │ │ │ │ │ └────────────────────────────────────────────┘ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ │ │ │ │ co 1 │ │ │ │◀─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ 7. continue to run... │ │ │ │ │ └──────────────────────────────────────────────┘