# 共享内存 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()