我們千方百計實現了程式的非同步,讓多個任務可以同時在幾個程序中併發處理,他們之間的執行沒有順序,一旦開啟也不受我們控制。儘管併發程式設計讓我們能更加充分的利用io資源,但是也給我們帶來了新的問題。
當多個程序使用同乙份資料資源的時候,就會引發資料安全或順序混亂問題。
import# 由併發變成了序列,犧牲了執行效率,但避免了競爭osimport
time
import
random
from multiprocessing import
process
defwork(n):
print('
%s: %s is running
' %(n,os.getpid()))
time.sleep(random.random())
print('
%s:%s is done
' %(n,os.getpid()))
if__name__ == '
__main__':
for i in range(3):
p=process(target=work,args=(i,))
p.start()
————————————分割————————————
import os
import time
import random
def work(lock,n):
lock.acquire() # 獲取鑰匙
print('%s: %s is running' % (n, os.getpid()))
time.sleep(random.random())
print('%s: %s is done' % (n, os.getpid()))
lock.release() # 歸還鑰匙
if __name__ == '__main__':
lock=lock() # 例項化
for i in range(3):
p=process(target=work,args=(lock,i)) # 將lock傳入work函式 並開啟乙個子程序指定target=work
p.start()
加鎖可以保證多個程序修改同一塊資料時,同一時間只能有乙個任務可以進行修改,即序列的修改,沒錯,速度是慢了,但犧牲了速度卻保證了資料安全。
雖然可以用檔案共享資料實現程序間通訊,但問題是:
1.效率低(共享資料基於檔案,而檔案是硬碟上的資料)
2.需要自己加鎖處理
因此我們最好找尋一種解決方案能夠兼顧:1、效率高(多個程序共享一塊記憶體的資料)2、幫我們處理好鎖問題。這就是mutiprocessing模組為我們提供的基於訊息的ipc通訊機制:佇列和管道。
佇列和管道都是將資料存放於記憶體中
佇列又是基於(管道+鎖)實現的,可以讓我們從複雜的鎖問題中解脫出來,
我們應該盡量避免使用共享資料,盡可能使用訊息傳遞和佇列,避免處理複雜的同步和鎖問題,而且在程序數目增多時,往往可以獲得更好的可獲展性。
程序鎖(互斥鎖)(Python)
3 搶票示例 import json import time from multiprocessing import process,lock defsearch i with open ticket encoding utf 8 as f ticket json.load f print s 當前...
python之路 併發程式設計之程序 互斥鎖
互斥鎖 將多個任務對修改共享資料的操作由併發變為 序列 沒有互斥鎖的情況下 json檔案 執行檔案 import os import time import json import random from multiprocessing import process def check with o...
python網編 程序之開啟乙個程序
直接上 import time,os from multiprocessing import process 匯入模組 deffunc time.sleep 1 print hello os.getpid os.getpid 的作用是列印程序id if name main process targe...