例子:對同一個數字進行加法運算
沒有使用鎖的程序如下:
[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]