當前位置:首頁 » 文件管理 » 多進程可以佔用同一個模型文件

多進程可以佔用同一個模型文件

發布時間: 2022-12-07 05:47:06

Ⅰ 多進程間可以共用一個線程嗎

1,進程:子進程是父進程的復製品。子進程獲得父進程數據空間、堆和棧的復製品。
2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
兩者都可以提高程序的並發度,提高程序運行效率和響應時間。
線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則可以跨機器遷移。
答案二:
根本區別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間。所有其它區別都是由此而來的:
1。速度:線程產生的速度快,線程間的通訊快、切換快等,因為他們在同一個地址空間內。
2。資源利用率:線程的資源利用率比較好也是因為他們在同一個地址空間內。
3。同步問題:線程使用公共變數/內存時需要使用同步機制還是因為他們在同一個地址空間內。

網上的答案的 版本怎麼想怎麼都太學術了。我當時看到過一個比喻特別的好, 我就模仿者把它說下來哈,有錯誤希望支持哈:
多進程的伺服器就好比是
立體的交通系統(立交橋)雖然說建造的時候花費比較大,消耗的資源比較多,但是真要是跑起來不會交通堵塞。但是汽車在上面跑,相互通信就是個很費事兒問題(進程間通信比較麻煩);多線程就好比是平面的交通系統,造價低,但是很容易交通堵塞,
但是也有好處同步的時候方便。
在網路伺服器方面:
單進程 < 多進程(單線程)< 多進程(多線程)
在游戲方面的應用:
I、多線程伺服器,玩家數據緩存和向DB的存儲我們可以開一個線程單獨去做,這樣不會有什麼大的問題。日誌和網路上面說過可以很容易切割出去,主要就是對游戲邏輯的切割。
A:按場景分線程,一個線程管理若干個場景。這樣配置靈活,一個線程可以管理若干個小場影,除非有個場景人多到一個CPU跑不下來,一般的游戲都會滿足需求。缺點則是不在同一線程的Object在做邏輯交互時,必須用非同步,如果用到了腳本,那麼這里的復雜度和性能要值得注意。如果項目中出現單個伺服器解決不鳥的問題(例如戰場伺服器),似乎就成了多線程多進程的龐大架構。
B:將某些功能切割到其它線程,例如Object的管理和查找,NPCAI的尋路,這種方式貌似在做邏輯需要分離到別的線程模塊功能時有點麻煩,如果直接上鎖等待肯定不是最好的方式,所以這些邏輯必須變成非同步。
2、多進程伺服器,其實這里的多進程和場景多線程改成了多進程。這里玩家數據緩存和向DB的存儲我覺得用一個單獨的DB伺服器。多進程伺服器可以在GameServer和GameClient之間加一個Gate,因為在跨服場景不需頻繁斷線連接。多進程伺服器所有的通訊都依靠網路,有些邏輯必須有網路延遲的消耗。優點是配置靈活,在物理機器性能不夠時可以通過擴充物理機器來解決
伺服器還有有一個很蛋疼的問題就是過載: 下面介紹一下產生的原因和解決辦法:
伺服器過載:
原因是高優先順序處理階段對CPU的不公平搶占。所以,如果限制高優先順序處理階段對CPU的佔用率,或者限制處理高優先順序的CPU個數,都可以減輕或者消除收包活鎖現象。具體的可以採用以下的方法:
方法一、採用輪詢機制
為了減少中斷對系統性能的影響,在負載正常的情況下採用「下半處理」的方法就非常有效,而在高負荷情況下,採用這個方法仍然會造成活鎖現象,這時可以採用輪詢機制。雖然這個方法在負載正常的情況下會造成資源的浪費和響應速度降低,但在網路數據頻繁到達伺服器時就要比中斷驅動技術有效的多。
方法二、減低中斷的頻率
這里主要有兩種方法:批中斷和暫時關閉中斷。批中斷可以在超載時有效的抑制活鎖現象,但對伺服器的性能沒有什麼根本性的改進;當系統出現接收活鎖跡象時,可以採用暫時關閉中斷的方法來緩和系統的負擔,當系統緩存再次可用時可以再打開中斷,但這種方法在接收緩存不夠大的情況下會造成數據包丟失。
方法三、減少上下文切換
這種方法不管伺服器在什麼情況下對性能改善都很有效,這時可以採用引入核心級(kerne1—leve1)或硬體級數據流的方法來達到這個目的。核心級數據流是將數據從源通過系統匯流排進行轉發而不需要使數據經過應用程序進程,這個過程中因為數據在內存中,因此需要CPU操作數據。
硬體級數據流則是將數據從源通過私有數據匯流排或是雖等DMA通過系統匯流排進行轉發而不需要使數據經過應用程序進程,這個過程不需要CPU操作數據。這樣在數據傳輸過程中不需要用戶線程的介入,減少了數據被拷貝的次數,減少了上下文切換的開銷。

Ⅱ PHP如何解決多進程同時讀寫一個文件的方法

  • /*

  • *flock(file,lock,block)

  • *file 必需,規定要鎖定或釋放的已打開的文件

  • *lock 必需。規定要使用哪種鎖定類型。

  • *block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。

  • *lock

  • *LOCK_SH 要取得共享鎖定(讀取的程序)

  • *LOCK_EX 要取得獨占鎖定(寫入的程序)

  • *LOCK_UN 要釋放鎖定(無論共享或獨占)

  • *LOCK_NB 如果不希望 flock() 在鎖定時堵塞

  • /*

  • if (flock($file,LOCK_EX))

  • {

  • fwrite($file,'write more words');

  • flock($file,LOCK_UN);

  • }

  • else

  • {

  • //處理錯誤邏輯

  • }

  • fclose($file);

  • )

Ⅲ python 多進程讀取同一個循環處理、可以用multiprocessing

可以每個在func中加上一個參數data,data是這個線程處理的數據;

多線程處理的時候,給每個線程分配相應的data就可以了。


給個示例:

#-*-coding:utf-8-*-
importthread,threading
importtime

defFuncTest(tdata):
printtdata

classmythread(threading.Thread):
def__init__(self,threadname):
threading.Thread.__init__(self)

defrun(self):
lock.acquire()
FuncTest(ft)
lock.release()

defMutiThread(num):
threads=[]
i=0
globalft
forxinxrange(num):
threads.append(mythread(num))
fortinthreads:
time.sleep(0.5)
lock.acquire()
ft=GetThreadParam(datafile,num,i)
#print'[%s]Thread:%s,Testdata:%s'%(time.ctime(),t,ft)
i=i+1
t.start()
lock.release()
fortinthreads:
t.join()

defGetThreadParam(datafile,num,curthread):
#線程數需要小於文件行數
f=open(datafile,'r')
lines=f.readlines()
divres=divmod(len(lines),num)
ifcurthread<(num-1):
res=lines[curthread*divres[0]:(curthread+1)*divres[0]]
elifcurthread==(num-1):
res=lines[curthread*divres[0]:((curthread+1)*divres[0]+divres[1])]
returnres
f.close()

if__name__=='__main__':

globalnum,lock
datafile='a.txt'

num=3#num並發數

lock=threading.Lock()
MutiThread(num)

a.txt文件內容如下

1

2

3

4

5

6

7

8

9

10


3個線程並發時,運行結果:

>>>

['1 ', '2 ', '3 ']

['4 ', '5 ', '6 ']

['7 ', '8 ', '9 ', '10']

Ⅳ Linux, 同時多個程序打開一個文件訪問並寫入,怎麼防止數據沖突,即有沒有一個程序可以實現排隊等候功能。

你說的是多進程還是多線程?

如果是多線程,可以考慮引入互斥鎖(Mutex,Mutual Exclusive Lock)。
獲得鎖的線程可以完成「讀-修改-寫」的操作,然後釋放鎖給其它線程,沒有獲得鎖的線程只能等待而不能訪問共享數據,這樣「讀-修改-寫」三步操作組成一個原子操作,要麼都執行,要麼都不執行,不會執行到中間被打斷,也不會在其它處理器上並行做這個操作。
Mutex變數是非0即1的,可看作一種資源的可用數量,初始化時Mutex是1,表示有一個可用資源,加鎖時獲得該資源,將Mutex減到0,表示不再有可用資源,解鎖時釋放該資源,將Mutex重新加到1,表示又有了一個可用資源。
注意避免死鎖就行了。

如果是多進程(多個不同的程序),可以考慮使用信號量(Semaphore),當然,也可用於同一進程的多線程。

真要具體講的話,非一兩句話可以了事,需要羅列代碼,否則太理論化了。建議樓主還是先在網上多看看吧。

Ⅳ 在ubuntu下兩個終端執行同一個文件夾下的同一個可執行文件算不算是多進程

是的,事實上你開兩個終端都可以看到是兩個進程。在終端下輸入:ps -aux 。你可以看到運行的進程。

Ⅵ 如何保證多進程操作同一個文件不沖突

(1)管道(Pipe):管道可用於具有親緣關系進程間的通信,允許一個進程和另一個與它有共同祖先的進程之間進行通信。(2)命名管道(namedpipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。命名管道在文件系統中有對應的文件名。命名管道通過命令mkfifo或系統調用mkfifo來創建。(3)信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數)。(4)消息(Message)隊列:消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺創建:msgget();寫入消息:msgsnd();讀取消息:msgrcv();刪除:msgctl();(5)共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。創建:shmget();附加:shmat();分離:shmdt();(6)內存映射(mappedmemory):內存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現它。(7)信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。創建:semget();控制刪除:semctl();(8)套介面(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和SystemV的變種都支持套接字。