八 8 1多程序鎖和共享記憶體

2022-08-28 13:18:09 字數 4143 閱讀 5203

多程序lock元件

當我們使用多程序讀寫檔案時,乙個程序寫檔案,乙個程序讀檔案。如果兩個程序同時進行,肯定不行,必須等寫結束後,才可以進行多操作。或者多個程序在共享一些資源時,同時只能有乙個程序進行訪問,需要乙個鎖機制控制。

import multiprocessing

import time

lock = multiprocessing.lock()

def add(number,value,lock):

with lock:

print "init add number=".format(value,number)

for i in xrange(1,5):

number += value

time.sleep(1)

print "add num = ".format(value,number)

if __name__ == "__main__":

number = 0

lock = multiprocessing.lock()

p1 = multiprocessing.process(target=add,args=(number,1,lock))

p2 = multiprocessing.process(target=add,args=(number,3,lock))

p1.start()

p2.start()

print "main end"

執行結果:

main end

init add1 number=0

init add3 number=0

add1 num = 1

add3 num = 3

add1 num = 2

add3 num = 6

add1 num = 3

add3 num = 9

add1 num = 4

add3 num = 12

加鎖操作with lock 方式使用:

#!/usr/bin/env python

#coding:utf8

# import multiprocessing

# lock = multiprocessing.lock()

# lock.acquire() 獲得鎖

# lock.release() 釋放鎖

#with lock 方式使用

# 不加鎖

# number + 1

# number + 3

import multiprocessing

import time

lock = multiprocessing.lock()

def add(number,value,lock):

with lock:

print "init add number=".format(value,number)

for i in xrange(1,5):

number += value

time.sleep(1)

print "add num = ".format(value,number)

if __name__ == "__main__":

number = 0

lock = multiprocessing.lock()

p1 = multiprocessing.process(target=add,args=(number,1,lock))

p2 = multiprocessing.process(target=add,args=(number,3,lock))

p1.start()

p2.start()

print "main end"

執行結果:

main end

init add1 number=0

add1 num = 1

add1 num = 2

add1 num = 3

add1 num = 4

init add3 number=0

add3 num = 3

add3 num = 6

add3 num = 9

add3 num = 12

lock.acquire方式使用

import multiprocessing

import time

lock = multiprocessing.lock()

def add(number,value,lock):

# with lock:

lock.acquire()

try:

print "init add number=".format(value,number)

for i in xrange(1,5):

number += value

time.sleep(1)

print "add num = ".format(value,number)

except exception as e:

raise e

finally:

lock.release()

if __name__ == "__main__":

number = 0

lock = multiprocessing.lock()

p1 = multiprocessing.process(target=add,args=(number,1,lock))

p2 = multiprocessing.process(target=add,args=(number,3,lock))

p1.start()

p2.start()

print "main end"

執行結果:

main end

init add1 number=0

add1 num = 1

add1 num = 2

add1 num = 3

add1 num = 4

init add3 number=0

add3 num = 3

add3 num = 6

add3 num = 9

add3 num = 12

共享記憶體:

python的multiprocessing模組也給我們提供了共享記憶體的操作

一般的變數在程序之間是沒法進行通訊的,multiprocessing給我們提供了

import multiprocessing

import time

def change(arr):

for i in range(len(arr)):

arr[i] = -arr[i]

if __name__ == "__main__":

print "main start"

arr = multiprocessing.array('i',range(10))

print arr[:]

p3 = multiprocessing.process(target=change,args=(arr,))

p3.start()

p3.join()

print arr[:]

import multiprocessing

import time

def add(number,add_value):

try:

print "init add number=".format(add_value, number.value)

for i in xrange(1, 5):

old_number_value = number.value

number.value += add_value

print " add num = + ".format(add_value,old_number_value, number.value)

print "#####add has added #####".format(add_value)

time.sleep(1)

print "add num = ".format(add_value, number.value)

except exception as e:

raise e

process finished with exit code 0

多程序鎖和共享記憶體

當我們用多程序來讀寫檔案的時候,如果乙個程序是寫檔案,乙個程序是讀檔案,如果兩個檔案同時進行,肯定是不行的,必須是檔案寫結束以後,才可以進行讀操作。或者是多個程序在共享一些資源的時候,同時只能有乙個程序進行訪問,那就要有乙個鎖機制進行控制。需求 乙個程序寫入乙個檔案,乙個程序追加檔案,乙個程序讀檔案...

多程序共享記憶體續篇 大鎖

讀寫鎖,就是多人可以同時訪問,但是同時只有乙個人可以修改的規則。由於鎖本身的申請和釋放,對於效能有很大的消耗,那麼一般寫只發生在特殊情況,也就是很少發生。讀鎖常在就是效能的優化方案,只有在申請寫鎖的時候,才會釋放讀鎖。和之前有什麼不一樣呢,例如,連續的在不同地方的100次讀,以前是要100次讀鎖的申...

多程序通訊(IPC) 共享記憶體

1 共享記憶體介紹 共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和...