rt,workman 進(jìn)程是單線程么,就是輪詢和執(zhí)行回調(diào), 是會(huì)沖突么?
如果我只啟動(dòng)一個(gè)進(jìn)程的話, 是不是無論timer 還是 onmessage 中的回調(diào),
都是按順序一個(gè)一個(gè)執(zhí)行的,處理數(shù)據(jù)都不需要加鎖?
還是 onMessage 之間會(huì)同時(shí)訪問相同的數(shù)據(jù)?
謝謝~~~以前用c++, 剛開始接觸php開發(fā)游戲服務(wù)器, 考慮的互斥有些多
rt,workman 進(jìn)程是單線程么,就是輪詢和執(zhí)行回調(diào), 是會(huì)沖突么?
多進(jìn)程單線程,輪詢和回調(diào)不會(huì)沖突
如果我只啟動(dòng)一個(gè)進(jìn)程的話, 是不是無論timer 還是 onmessage 中的回調(diào),
都是按順序一個(gè)一個(gè)執(zhí)行的,處理數(shù)據(jù)都不需要加鎖?
還是 onMessage 之間會(huì)同時(shí)訪問相同的數(shù)據(jù)?
對(duì),順序執(zhí)行,不需要加鎖。
補(bǔ)充問一下,如果保證了用戶只在一個(gè)進(jìn)程通信的話,這個(gè)用戶無論并發(fā)多少請(qǐng)求,實(shí)際上都是同步執(zhí)行的嗎,比如在這個(gè)進(jìn)程內(nèi)為用戶實(shí)例化了一個(gè)角色對(duì)象,針對(duì)角色對(duì)象內(nèi)的屬性更改,背包數(shù)據(jù)增刪改,都不需要加鎖防止并發(fā)修改對(duì)吧,肯定是一個(gè)信息過來處理完了才會(huì)處理下一個(gè)信息嗎
目前就是把角色的一些屬性冗余到了內(nèi)存中(globaldata能保證原子性的情況下數(shù)據(jù)結(jié)構(gòu)太簡(jiǎn)單無法滿足使用),之前用了mysql的get_lock來加鎖處理,寫了一半才想起來,對(duì)用戶來說mysql鏈接一直是一個(gè),所以這個(gè)鎖現(xiàn)在加了和沒加一樣,所以在考慮是不是要自己加一個(gè)內(nèi)存的鎖來保證數(shù)據(jù)完整,但是如果用戶自己不會(huì)并發(fā)處理數(shù)據(jù)的話,那么我完全也不需要考慮加鎖問題了,麻煩給解答一下
另外上面說的是 用戶自己對(duì)自己資源的爭(zhēng)奪問題
還有一個(gè)問題就是 全服游戲玩家,這時(shí)候涉及到多個(gè)進(jìn)程了,如果先不談多個(gè)進(jìn)程,只談一個(gè)進(jìn)程,那么在同一個(gè)進(jìn)程內(nèi)的多個(gè)玩家,是否也是同步執(zhí)行的邏輯,不會(huì)有資源爭(zhēng)搶的問題,一個(gè)進(jìn)程內(nèi)所有的消息回調(diào) 處理都是同步的嗎,這樣的話共同去修改內(nèi)存的某個(gè)數(shù)據(jù)是否保證是原子性的
一個(gè)進(jìn)程內(nèi)的所有業(yè)務(wù)邏輯都是串行的,一個(gè)進(jìn)程內(nèi)的業(yè)務(wù)代碼不會(huì)有并發(fā)執(zhí)行的情況。如果保證了用戶只在一個(gè)進(jìn)程通信,無論并發(fā)多少請(qǐng)求,實(shí)際上都是同步執(zhí)行的。如果角色對(duì)象的屬性是內(nèi)存的變量,則不需要加鎖。如果角色對(duì)象的屬性存儲(chǔ)在外部存儲(chǔ)中,并且沒有其它進(jìn)程操作這些屬性也不需要加鎖,否則需要。
多個(gè)用戶也是一樣的情況,單個(gè)進(jìn)程內(nèi)業(yè)務(wù)代碼不會(huì)并發(fā)執(zhí)行,都是串行的,不會(huì)有并發(fā)操作內(nèi)存變量的問題。操作外部存儲(chǔ)的時(shí)候仍然需要考慮多個(gè)進(jìn)程并發(fā)操作的情況。