本篇文章的主要內(nèi)容是關(guān)于對swoole事件處理流程的解析,感興趣的朋友可以了解一下,希望本文能對你有所幫助。
了解swoole事件處理流程,先了解兩種網(wǎng)絡(luò)事件處理模式。
Reactor模式
它要求主線程(I/O處理單元)只負(fù)責(zé)監(jiān)聽文件描述符上是否有事件發(fā)生,有的話就立即將該事件通知工作線程/進(jìn)程(邏輯單元)。除此之外,主線程不做任何其他工作。讀寫數(shù)據(jù),接受新的連接,以及處理客戶請求均在工作線程中完成。
Proactor模式
兩種實(shí)現(xiàn)
使用I/O異步模型實(shí)現(xiàn)Proactor模式。原理:將所有I/O操作都交給主線程,主線程配合和內(nèi)核來處理,業(yè)務(wù)邏輯操作就交給邏輯單元。例如使用aio_read來實(shí)現(xiàn)。
工作流程:
主線程調(diào)用aio_read函數(shù)向內(nèi)核注冊socket上的讀完成事件。
主線程繼續(xù)處理其他I/O事件。
當(dāng)socket上的數(shù)據(jù)被讀入用戶緩沖區(qū)后,內(nèi)核向應(yīng)用程序(邏輯單元)發(fā)送一個信號,通知應(yīng)用程序數(shù)據(jù)可用。
應(yīng)用程序讀取數(shù)據(jù)(客戶端的請求),處理完后,調(diào)用aio_write函數(shù)向內(nèi)核注冊socket上的寫事件。
主線程繼續(xù)處理其他邏輯。
當(dāng)用戶緩沖區(qū)的數(shù)據(jù)寫入socket后,內(nèi)核向應(yīng)用程序發(fā)送一個信號,通知應(yīng)用程序數(shù)據(jù)發(fā)送完畢。
應(yīng)用程序預(yù)先定義好的信號處理函數(shù)來處理善后處理,比如關(guān)閉socket.
使用I/O同步模型實(shí)現(xiàn)Proactor模式。原理:主線程執(zhí)行I/O事件數(shù)據(jù)的讀寫操作,業(yè)務(wù)邏輯操作就交給邏輯單元。例如使用epoll來實(shí)現(xiàn)。
工作流程:
主線程往epoll內(nèi)核事件表中注冊socket上的讀就緒事件。
主線程調(diào)用epoll_wait等待socket上有數(shù)據(jù)可讀。
epoll_wait有返回后,主線程從socket上讀取數(shù)據(jù),然后將讀取到的數(shù)據(jù)封裝成一個請求對象(客戶端的請求),并插入請求隊(duì)列。
于是隊(duì)列的消費(fèi)者線程處理請求對象,然后在epoll內(nèi)核事件表中注冊socket上的寫就緒事件。
主線程調(diào)用epoll_wait等待socket可寫。
當(dāng)socket可寫時(shí),epoll_wait通知主線程。主線程往socket寫入請求結(jié)果。
可以看出,如果我們把Reactor線程和Work進(jìn)程組合起來,看成工作線程的話,swoole使用的是reactor事件處理模式。
一個請求經(jīng)歷的步驟如下:
1. 服務(wù)器主線程等待客戶端連接。
2. Reactor線程處理接連socket,讀取socket上的請求數(shù)據(jù)(Receive),將請求封裝好后投遞給work進(jìn)程。
3. Work進(jìn)程就是邏輯單元,處理業(yè)務(wù)數(shù)據(jù)。
4. Work進(jìn)程結(jié)果返回給Reactor線程。
5. Reactor線程將結(jié)果寫回socket(Send)。
新聞熱點(diǎn)
疑難解答