zoukankan      html  css  js  c++  java
  • 多进程之间数据通讯

    有三种方式:

    1 进程对列Queue

    from multiprocessing import Process, Queue
    import queue
    
    def f(q,n):
        q.put(n*n+1)
        print("son process",id(q))
    
    if __name__ == '__main__':
        q = Queue()        #通过Queue对象来进行通信
        print("main process",id(q))
    
        for i in range(3):
            p = Process(target=f, args=(q,i))   #子进程 需要把这个q传递给函数操作
            p.start()
    
        print(q.get())    #主进程就能获取到子进程操作的数据
        print(q.get())
        print(q.get())

    2 管道

    from multiprocessing import Process, Pipe

    def f(conn):
    conn.send([12, {"name":"123"}, 'hello']) #发送消息给主进程
    response=conn.recv() #接收主进程发过来的消息
    print("接收主进程消息1:",response)
    print("接收主进程消息2:",conn.recv())
    conn.close()


    if __name__ == '__main__':
    parent_conn, child_conn = Pipe() #主进程创建一个管道对象,这管道对象,会拿到2个对象
    p = Process(target=f, args=(child_conn,)) #child_conn 把主进程的通信管道传递给子进程
    p.start()

    print(parent_conn.recv()) # "[12, {"name":"123"}, 'hello']" 如果子进程不发消息过来,这里会阻塞状态,等子进程传递消息
    parent_conn.send("主进程发子进程的消息1") #发送给子进程
    parent_conn.send("主进程发子进程的消息2")
    p.join()

    结果是:

      [12, {'name': '123'}, 'hello']
      接收主进程消息1 主进程发子进程的消息1
      接收主进程消息2 主进程发子进程的消息2

     

    3 Queue和pipe(管道)只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

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

    if __name__ == '__main__':
    with Manager() as manager: #就相当不用关闭了连接
    d = manager.dict() #需要通过manager创建一个字典
    l = manager.list(range(5)) #需要通过manager创建一个列表
    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()

    print(d) #主进程,打印子进程处理后的字典数据
    print(l) #主进程,打印子进程处理后的列表数据


  • 相关阅读:
    Linux-Rsync命令参数详解
    Linux-iptables(2)
    Linux-iptables
    Linux-awk command
    Linux-sed command
    Linux-tomcat
    C#调用默认浏览器打开网页的几种方法
    个人记录用
    .NET中的Request
    sql标量值函数,将汉字转化为拼音,无音标
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9145641.html
Copyright © 2011-2022 走看看