1. 程式人生 > >Python 多程序 multiprocessing 中篇

Python 多程序 multiprocessing 中篇

# 共享記憶體 share memory
'''
如果多個程序要訪問相同的變數,應該使用共享記憶體
multiprocessing 有兩種共享記憶體,
Value和Array 
注意,這裡的Array只能是一維的。
'''

'''
訪問Value v1不能直接把v1當作值
要通過v1.value得到值
但是Array可以直接arr[i]得到
子程序也可以修改共享記憶體的值
'''
import os, time 
import multiprocessing
from multiprocessing import Process 

def job(n, v):
    v.value = 10 * v.value 
    x 
= n * v.value return x def job_arr(n, arr): n_arr = len(arr) for i in range(n_arr): arr[i] *= n return sum(arr) def main(): v1 = multiprocessing.Value('i', 2) v2 = multiprocessing.Value('d', 3.0) arr = multiprocessing.Array('d', [1.0, 3.0, 4.0]) p1 = Process(target = job, args = (2, v1)) p2
= Process(target = job, args = (4, v1)) p1.start() p1.join() p2.start() p2.join() print(v1.value) p3 = Process(target = job_arr, args = (3, arr)) p3.start() p3.join() for i in range(len(arr)): print(arr[i], end = ' ') if __name__ == "__main__": main()
# 鎖 Lock
'''
多個程序修改同一個資料,可能會修改亂了。
因為多個程序之間是並行的。
所以,要加上鎖,只有程序獲得鎖,才能執行,否則就等待鎖的釋放。
'''
import os, time 
import multiprocessing as mp 
from multiprocessing import Process, Lock 

def job(v1, l):
    l.acquire()
    try:
        v1.value += 1
    finally:
        l.release()

    print("Current process is {} at PID({}).".format(   
        mp.current_process().name, os.getpid() ))
    time.sleep(2)
    x = 0
    for i in range(10):
        x += i**3
    print("Result: {}".format(x))
    return x 

def main():
    l = Lock()
    v1 = mp.Value('d', 12.3)
    p1 = Process(target = job, args = (v1, l), name = "p1")
    p2 = Process(target = job, args = (v1, l), name = "p2")
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    print(v1.value)
    print("All done.")

if __name__ == "__main__":
    main()
# 佇列Queue
'''
multiprocessing程序通訊常用的兩種方式
Queue和Pipe
這裡介紹Queue
Queue是個佇列,因為子程序沒法直接返回值到主程序
所以,把子程序的運算結果put到一個Queue中,
在主程序通過Queue的get()來得到子程序的值。
'''
import os, time 
import multiprocessing as mp 
from multiprocessing import Process, Queue 

def job(n, q):
    print("Current process is {} at PID({}).".format(   
        mp.current_process().name, os.getpid() ))
    x = 0
    for i in range(n):
        x += i**3
    print("Result: {}".format(x))
    q.put(x)
    return x 

def main():
    q = Queue()
    p1 = Process(target = job, args = (10, q), name = "p1")
    p2 = Process(target = job, args = (20, q), name = "p2")
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    print("Subprocesses done.")
    print(q.get())
    print(q.get())
    print("All done.")

if __name__ == "__main__":
    main()