多進程鎖和多進程共享內存


 

 

例子:對同一個數字進行加法運算
 
沒有使用鎖的程序如下:
[root@web thread_process]# cat multi3.py
#!/usr/bin/env python

import multiprocessing
import time

def add(number, increment, lock):
    print 'init number{0} = {1}'.format(increment, number)
    for i in xrange(5):
        number += increment
        time.sleep(1)
        print 'add number{0} = {1}'.format(increment, number)


if __name__ == '__main__':
    number = 0
    lock = multiprocessing.Lock()
    p1 = multiprocessing.Process(target=add, args=(number, 1, lock))        //沒有加鎖時,子進程各自獨立運行,兩個子進程同時都對number進行加法運算
    p2 = multiprocessing.Process(target=add, args=(number, 3, lock))
    p1.start()
    p2.start()
    print 'main end'
[root@web thread_process]# python multi3.py
main end
init number3 = 0
init number1 = 0
add number3 = 3                            //結果是無序排列的
add number1 = 1
add number3 = 6
add number1 = 2
add number3 = 9
add number1 = 3
add number1 = 4
add number3 = 12
add number1 = 5
add number3 = 15

 

 

使用鎖的程序如下:

[root@web thread_process]# cat multi3.py   
#!/usr/bin/env python

import multiprocessing
import time

def add(number, increment, lock):
    with lock:
        print 'init number{0} = {1}'.format(increment, number)
        for i in xrange(5):
            number += increment
            time.sleep(1)
            print 'add number{0} = {1}'.format(increment, 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'


[root@web thread_process]# python multi3.py
main end
init number1 = 0             //誰先搶到鎖誰先運行,另外一個被阻塞,直到當前鎖被釋放
add number1 = 1
add number1 = 2
add number1 = 3
add number1 = 4
add number1 = 5
init number3 = 0
add number3 = 3
add number3 = 6
add number3 = 9
add number3 = 12
add number3 = 15

 

 

加鎖的另外一種寫法:
[root@web thread_process]# cat multi3.py   
#!/usr/bin/env python

import multiprocessing
import time

def add(number, increment, lock):
    lock.acquire()
    try:
        print 'init number{0} = {1}'.format(increment, number)
        for i in xrange(5):
            number += increment
            time.sleep(1)
            print 'add number{0} = {1}'.format(increment, 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'
[root@web thread_process]# python multi3.py
main end
init number3 = 0
add number3 = 3
add number3 = 6
add number3 = 9
add number3 = 12
add number3 = 15
init number1 = 0
add number1 = 1
add number1 = 2
add number1 = 3
add number1 = 4
add number1 = 5

 

 

Value的例子:

[root@web thread_process]# cat multi4.py
#!/usr/bin/env python

import multiprocessing
import time

def add(number, increment):
    try:
        print 'init number{0} = {1}'.format(increment, number.value)
        for i in xrange(5):
            number.value += increment
            time.sleep(1)
            print 'add number{0} = {1}'.format(increment, number.value)
    except Exception as e:
        raise e


if __name__ == '__main__':
    number = multiprocessing.Value('i', 0)      //定義共享對象
#    number.value                                //獲得共享對象
    p1 = multiprocessing.Process(target=add, args=(number, 1))
    p2 = multiprocessing.Process(target=add, args=(number, 3))
    p1.start()
    p2.start()
    print 'main end'

#加不加鎖都可以,加鎖的話顯示的結果順序會好看點

[root@web thread_process]# python multi4.py
main end
init number1 = 0             //其中一個子進程對number賦值為0
init number3 = 1             //另一個子進程獲得共享的number的值0,然后+1=1
add number3 = 4
add number1 = 7
add number3 = 8
add number1 = 11
add number1 = 12
add number3 = 13
add number3 = 16
add number1 = 19
add number3 = 20             //區別:沒有定義number為共享對象時,number3最后的值為15,number1的值為5
add number1 = 20             //      定義number為共享對象后,兩個子進程每次做加法運算時獲得的number的值都為最新的值,所以最后number=20

 

 

Array的例子:

[root@web thread_process]# cat multi5.py
#!/usr/bin/env python

import multiprocessing

def func(arr):
    for i in xrange(len(arr)):
        arr[i] = -arr[i]


if __name__ == '__main__':
    arr = multiprocessing.Array('i', range(10))
    p = multiprocessing.Process(target=func, args=(arr,))
    print type(arr[:])
    print arr[:]
    p.start()
    p.join()        //必須阻塞主進程,否則主進程退出了,子進程也跟着退出,func函數沒有執行,arr[:]沒有任何改變
    print arr[:]


[root@web thread_process]# python multi5.py
<type 'list'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM