043进程通信和数据共享

内容:进程通信1、Pipes;2、Queue,以及例子和练习

不同进程的通信有两种,1、是Pipes,2、是Queue    ,一般不用Pipes
##########################################
1、Queue实现进程通信
通过创建线程的时候传递数据

print(os.getppid())    # os.getppid()获取父进程的id
print(os.getpid())    # os.getpid()或者该进程的id

from multiprocessing import Process,Queue
def f(q,n):
    q.put([42,n,'hello'])
if __name__ == '__main__':
    q = Queue()
    p_list = []
    for i in range(3):
        p = Process(target=f,args=(q,i))
        p_list.append(p)
        p.start()
    print(q.get())
    print(q.get())
    print(q.get())
    for i in p_list:
        i.join()

信息在Queue里面通信,这里可以看出,需要的信息通过进程加入到 q 里面后,就可以通过 q 操作。

##########################################################################

2、Pipes实现进程通信
步骤:1)建立Pipe对象,拿到两个进程通信对象
2)通过参数传递,把子进程通信对象发送给子进程
3)通过send和recv通信

from multiprocessing import Process,Pipe
def f(conn):
    conn.send([42,None,'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()      # 获取父子通信的通信对象
    p = Process(target=f,args=(child_conn,)) 
    p.start()
    print(parent_conn.recv())
    p.join()

###################################################
数据共享

from multiprocessing import Process,Manager
def f(d,l,n):
    d[n] = '1'
    d['2'] = 2
    d[0.25] = None
    l.append(n)
    print(l)

if __name__ == '__main__':
    with Manager() as manager:        # with open() as f    ==    f = open()    
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []
    for i in range(10):
        p = Process(target=f,args=(d,l,i))
        p.start()
        p_list.append(p)

    for res in p_list:
        res.join()
练习

线程和进程池
http://www.cnblogs.com/yuanchenqi/articles/5733873.html
——多线程(threading模块)

原文地址:https://www.cnblogs.com/-nbloser/p/8687061.html