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

ernestwang 1 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('主进程结束')

练习

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

发表评论 (已有0条评论)

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