python 进程管理-数据共享

ernestwang 875 0

数据共享

  • 全局变量:不能共享
    import multiprocessing
    
    # 全局变量多个进程之间不能共享
    num = 250
    
    def run():
        global num
        print('子进程开始')
        num += 10
        print('子进程操作')
        print('子进程结束')
        
    if __name__ == '__main__':
        print('主进程开始')
        p = multiprocessing.Process(target=run)
        p.start()
        p.join()
        print('主进程结束', num)  
  • 管道pipe
    import multiprocessing
    
    def run(p_a):
        recv = p_a.recv()
        print('子进程接收到数据:', recv)
        p_a.send('world')
        
    if __name__ == '__main__':
        # 创建管道
        # 全双工:两个都可以进行收发数据,默认就是
        p_a, p_b = multiprocessing.Pipe()
        # 半双工:p_a只能接收数据,p_b只能发送数据
        # p_a, p_b = multiprocessing.Pipe(duplex=False)
        p = multiprocessing.Process(target=run, args=(p_a,))
        p.start()
        p_b.send('hello')
        p.join()
        print('主进程结束', p_b.recv())
  • 队列queue
    • 基本使用
    import multiprocessing
    
    if __name__ == '__main__':
        # 创建一个队列:数据先进先出
        q = multiprocessing.Queue(3)
    
        # 判断队列是否为空
        print(q.empty())
    
        # 判断队列是否已满
        print(q.full())
    
        # 向列队中插入数据
        q.put('how')
        q.put('are')
        q.put('you')
        # 若队列已满,在放数据则会阻塞
        # q.put('hello')
        # 若队列已满,使用下面的函数则会报错
        # q.put_nowait('hello')
    
        # print(q.full())
    
        # 从队列中获取数据
        print(q.get())
        print(q.get())
        print(q.get())
        # 若数据已满,再次获取则会阻塞
        # print(q.get())
        # 若队列为空,获取数据会报错
        # print(q.get_nowait())
    
        # 获取队列的长度(队列中此时有多少个数据)
        print(q.qsize())
    
        # 关闭队列
        q.close()
    • 进程间传输数据
    import multiprocessing
    import os
    import time
    
    # 写数据
    def write_data(q):
        for i in range(5):
            data = 'PID:{} time:{}'.format(os.getpid(), time.time())
            print('写入数据:', data)
            q.put(data)
            time.sleep(0.5)
            
    # 读数据
    def read_data(q):
        for i in range(5):
            data = q.get()
            print('读取数据:', data)
            time.sleep(1)
    
    if __name__ == '__main__':
        # 创建队列
        q = multiprocessing.Queue(3)
    
        # 创建写数据进程
        p_w = multiprocessing.Process(target=write_data, args=(q,))
        # 创建读数据进行
        p_r = multiprocessing.Process(target=read_data, args=(q,))
    
        # 启动进程
        p_w.start()
        p_r.start()
    
        # 等待进程结束
        p_w.join()
        p_r.join()
    
        print('主进程结束')

标签: 进程管理 python

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

复制成功
微信号: irenyuwang
关注微信公众号,站长免费提供流量增长方案。
我知道了