查了官方文檔和社區(qū)的討論,一直沒搞清楚的如何獲取異步任務(wù)的返回值。我現(xiàn)在使用webman提供一個(gè)http接口,該功能需要實(shí)現(xiàn)以下:
去ES的A索引中查詢數(shù)據(jù)
去數(shù)據(jù)庫中查詢
去ES的B索引中查詢數(shù)據(jù)
以上三步IO沒有次序,我想可以用多進(jìn)程的思路來提高并發(fā)量。
如果是在其他php-cli環(huán)境下,我可以fork三個(gè)子進(jìn)程,然后阻塞父進(jìn)程等待三個(gè)子進(jìn)程的返回,得到三個(gè)子進(jìn)程的返回后,父進(jìn)程統(tǒng)一組裝數(shù)據(jù)響應(yīng)給調(diào)用方。
但是在webman中如何實(shí)現(xiàn)呢?
我看文檔中有說明可以創(chuàng)建帶監(jiān)聽的task進(jìn)程,然后控制器中使用異步TCP客戶端的方式去投遞任務(wù),然后在異步TCP客戶端的回調(diào)中獲取返回結(jié)果,但是這種情況下我在控制器這個(gè)主進(jìn)程怎么阻塞等待三個(gè)任務(wù)的返回???
可以將這三個(gè)步驟封裝成http接口,然后用guzzle并發(fā)請(qǐng)求它們,類似微服務(wù)調(diào)用。
好的,謝謝哈。那就是在http請(qǐng)求中實(shí)際上不太容易做異步。我看社區(qū)中說webman不能使用wokerman/http-client異步包,我實(shí)際測(cè)試中發(fā)現(xiàn)webman可以使用,但是異步效果似乎不適合在控制器中寫,更適合用于websocket這種主動(dòng)推送的,我試試使用yzh52521/easyhttp 這個(gè)包并發(fā)請(qǐng)求