• 三种进程和线程数据共享模块方法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的实例

     

  • 相关阅读:
    Intellij IDEA使用restclient测试
    jmeter测试
    Java中String为什么是不可变的
    为什么String类是不可变的?
    反射中getMethods 与 getDeclaredMethods 的区别
    MD5加密
    将long型转换为多少MB的方法
    ContentProvider往通讯录添加联系人和获取联系人
    安卓软件版本更新
    Servlet生命周期与工作原理
  • 原文地址:https://www.cnblogs.com/cerofang/p/8018647.html
Copyright © 2020-2023  润新知