Python 多程序 multiprocessing 中篇
阿新 • • 發佈:2018-12-11
# 共享記憶體 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()