python 进程管理-数据共享

    SEO基础 wuya 77次浏览 已收录 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)
    发表我的评论
    取消评论
    表情 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址