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()

猜你喜欢

转载自www.cnblogs.com/tangjicheng/p/10100184.html