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