比如業(yè)務(wù)處理使用一個(gè)統(tǒng)一的class(class是在onWorkerStart創(chuàng)建的,共用)
一條消息來(lái)了,給class設(shè)置data,然后再執(zhí)行class的邏輯
如果不是按順序,那會(huì)出現(xiàn),前一個(gè)消息設(shè)置了data但邏輯還沒(méi)跑完,后一個(gè)消息來(lái)了后更改data導(dǎo)致前面一條數(shù)據(jù)異常
或者不同進(jìn)程存在此問(wèn)題,同一進(jìn)程沒(méi)問(wèn)題?
大神求解
一個(gè) Worker 是一個(gè)進(jìn)程。
當(dāng)你的 BusinessWorker 接收到一個(gè)消息之后,只要是同步代碼一直在執(zhí)行,就不會(huì)被另一個(gè)消息的到來(lái)所打擾,直到你的 Events::onMessage 返回之后,當(dāng)前的 Worker 就準(zhǔn)備接收下一個(gè)消息了。
所以問(wèn)題的關(guān)鍵在于你處理一個(gè)消息的 PHP 程序是不是完全同步執(zhí)行的。如果你用到了定時(shí)器或者異步組件(react/mysql 或者 react/redis 之類(lèi)),那就不好說(shuō)了,很可能異步操作還沒(méi)有執(zhí)行完,下一個(gè)消息就到來(lái)并開(kāi)始處理了。