python:进程数据共享-自定义进程类

    Python编程 wuya 97次浏览 已收录 0个评论

    数据共享

    • 全局变量:无法在多个进程之间共享
      import multiprocessing
      
      # 多进程之间不能进行全局变量共享
      num = 100
      
      def run():
          global num
          print('子进程开始')
          num += 10
          # print('子进程:', num)
          print('子进程结束')
       
      if __name__ == '__main__':
          print('主进程开始')
          p = multiprocessing.Process(target=run)
          p.start()
          p.join()
          print('主进程结束', num)   
    • 管道
      import multiprocessing
      
      def run(p_a):
          # 子进程接收数据
          recv = p_a.recv()
          print('子进程接收到数据:', recv)
          # 子进程发送数据
          p_a.send('world')
          print('子进程结束') 
          
      if __name__ == '__main__':
          # 创建管道
          # duplex:是否是全双工,默认为True
          # 半双工:p_a只能接收数据,p_b只能发送数据
          p_a, p_b = multiprocessing.Pipe()
          # 创建子进程
          p = multiprocessing.Process(target=run, args=(p_a,))
          p.start()
          # 主进程发送数据
          p_b.send('hello')
          p.join()
          # 主进程接收子进程发来的数据
          print('主进程结束', p_b.recv())
    • 队列
      import multiprocessing
      
      if __name__ == '__main__':
          # 创建一个队列,指定容量
          q = multiprocessing.Queue(3)
          # 判断是否为空
          print(q.empty())
      
          # 向队列中添加数据
          q.put('how')
          q.put('are')
          q.put('you')
      
          # 判断是否已满
          print(q.full())
          # 若队列已满,再放数据则会阻塞
          # q.put('hello')
          # 若队列已满,则会崩溃
          # q.put_nowait('hello')
      
          # 获取数据
          print(q.get())
          # print(q.qsize())
          print(q.get())
          print(q.get())
          # 若队列已空,再获取数据会阻塞
          # print(q.get())
          # 若队列已空,再获取数据会崩溃
          # print(q.get_nowait())
          # 队列长度(队列中的数据数量)
          print(q.qsize())
          # 队列关闭
          q.close()

    自定义进程类

    • 说明:将进程处理封装成类,要求继承自multiprocessing.Process
    • 示例:
      from multiprocessing import Process
      import time
      
      class DownloadProcess(Process):
          def __init__(self, file):
              super().__init__()
              self.file = file
      
          # 在调用start方法后会自动调用
          # 改方法就是进程任务,无需单独指定
          def run(self):
              print('{}文件开始下载'.format(self.file))
              for i in range(1, 6):
                  time.sleep(1)
                  print('进度{}%'.format(i * 20))
              print('{}文件下载完成'.format(self.file))
              
      if __name__ == '__main__':
          print('主进程开始')
          dp = DownloadProcess('meinv.jpg')
          dp.start()
          dp.join()
          print('主进程结束')

    练习

    • 使用队列完成进程之间的数据共享
    • 预习线程操作

    学海无涯 , 版权所有丨如未注明 , 均为原创丨转载请注明python:进程数据共享-自定义进程类
    喜欢 (0)
    发表我的评论
    取消评论
    表情 加粗 删除线 居中 斜体 签到

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

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