欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

043进程通信和数据共享

程序员文章站 2022-03-30 13:42:10
内容:进程通信1、Pipes;2、Queue,以及例子和练习 不同进程的通信有两种,1、是Pipes,2、是Queue ,一般不用Pipes##########################################1、Queue实现进程通信通过创建线程的时候传递数据 信息在Queue里面通 ......

内容:进程通信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()

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

043进程通信和数据共享
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模块)