一、具體流程:
每次有個請求,處理線程把請求的消息放在 全局隊列global queue裏面,每次線程pop一個次級queue的消息出來,再用協程去處理具體的消息(等待協程處理完回調,等次級queue 的消息處理完再返回 global queue 再給原來調用這個服務的請求)如圖示
二、代碼分析:
1、消息傳遞:
- global queue 包含(次級queue)
- skynet.send(插入次級queue) 【協程處理消息】
- skynet_context_push(mq取出次級queue,插入消息)
- global queue 的 push 操作 +了自旋鎖【多線程】
2、創建thread:skynet_start.c的start
每個worker都有一個weight值,pop出n條消息(受weight值影響):一次性消費多少條次級queue的消息
線程安全:避免服務重複調用,如何是連續兩個相同的服務請求?
1)這個次級消息隊列要從全局消息隊列裏取
2)雖然一個服務的callback函數,只能在一個thread內被調用,但是在多個thread中,可以向同一個次級消息隊列push消息,即便是該次級消息隊列所對應的服務正在執行callback函數