三种进程和线程数据共享模块方法Queue》Pipe》manager

》》》》线程中的queue

import threading
import queue
def f(qq):
    print("in child",qq.qsize())#打印父进程中q扥数据个数
    qq.put([42,None,'hellow'])#往父进程中的q增减新的数据

if __name__ == '__main__':
    q = queue.Queue()#父进程生成一个q
    q.put('test123')#往父进程中增加数据
    p = threading.Thread(target=f,args=(q,))#生成一个子线程,子线程执行函数f
    p.start()#执行子线程
    p.join()#等待子线程执行结束之后,父进程往下执行
    print("444", q.get_nowait())#第一次取q中的数据
    print("444", q.get_nowait())#第二次取q中的数据

  1,父线程中生成一个q,子线程可以直接对q中的数据进行访问,访问完后父线程可以对子线程放入的数据进行操作,即数据实现了共享

》》》》》》》》进程中的queue

from multiprocessing import Process,Queue

import threading
def f(qq):
    print("in child",qq.qsize())
    qq.put([42,None,'hellow'])

if __name__ == '__main__':
    q = Queue()#生成一个    q
    q.put('test123')
    p = Process(target= f,args=(q,))#生成一个线程,与主线程完全独立的内存地址,将q作为参数传递给函数f
    p.start()
    p.join()
    print("444", q.get_nowait())
    print("444", q.get_nowait())

  1,区别线程中的queue和进程中的Queue的不同

》》》》》》》》》》》》》》》》Pipe

from multiprocessing import Process,Pipe

def f(conn):
    conn.send([42, None, 'hellow from child1'])
    print("from parent", conn.recv())
    conn.send([42, None, 'hellow from child2'])
    print("from parent",conn.recv())
    conn.close()

if __name__ == "__main__":
    parent_conn , child_conn = Pipe()
    p = Process(target = f ,args= (child_conn,))
    p.start()
    print(parent_conn.recv())
    parent_conn.send('我是主线程过来的1')
    print(parent_conn.recv())
    parent_conn.send('我是主线程过来的2')
    p.join()

  1,parent_conn , child_conn = Pipe()生成电话线两端的实例,相互接受

》》》》》》》》》》》》》manager

from multiprocessing import Process,Manager
import os
def f(d,l):#定义了一个字典和一个列表
    d[(os.getpid())] = os.getpid()#当前线程的进程好加入到字典中
    l.append(os.getpid())#当前进程的进程号加入到列表中
    print(l)
if __name__ == '__main__':
    # with Manager() as manager:
        manager = Manager()#生成一个manager的实例
        d = manager.dict()#生成一个字典可在多进程间共享和传递
        l = manager.list(range(5))#生成一个列表可在多进程间共享和传递
        p_list = []
        for i in range(10):
            p = Process(target=f,args=(d , l ))#生成带两个参数的进程
            p.start()
            p_list.append(p)
        for result in p_list:
            result.join()#等待结果
        print(d)
        print(l)

  1,with Manager() as manager:

        2. manager = Manager()#生成一个manager的实例

 

 

posted @ 2017-12-11 23:06  cerofang  阅读(199)  评论(0编辑  收藏  举报