python开发Day10(多进程多线程补充)

关于进程:

    • 介绍:

      • 在python中如果想要操作进程需要使用模块multprocessing
    • 使用:

      • Process  #进程
        • 介绍:
          • 操作进程使用multprocessing下的Process模块,注:进程之间的内存是不共享的!(可以共享需要一个特殊的特殊的数据结构Array(数组))
        • 使用:
          • p = Process(target=函数,args=(参数,))   #创建线程
          • p.daemon(True)    #当参数为Ture的时候为主进程执行完毕后退出程序,为False的时候为等待子进程执行完毕后退出,默认为False
          • p.join()  #和线程的同样,很少使用!
          • 使用Array来让多个进程修改一个数据
            from multiprocessing import Process,Array
            def f(a,b):
                b[a] = 100 + a
            if __name__ == '__main__':
                temp = Array('i',[11,22,33,44])
                for i in range(2):#循环两次执行f函数修改列表的值
                    p = Process(target=f,args=(i,temp,))
                    p.start()
                    p.join()
                for i in temp:
                    print(i)
            执行结果:
            100
            101
            33
            44
            View Code
          •  利用manager实现多进程之间共享数据
            from multiprocessing import Process,Manager
            def f1(a,b):
                b[a] = 100 + a
                print(b)
            
            if __name__ == '__main__':
                manage = Manager()
                dic = manage.dict()
                for i in range(5):
                    p = Process(target=f1,args=(i,dic,))
                    p.start()
                    p.join()
            执行结果:
            {0: 100}
            {0: 100, 1: 101}
            {0: 100, 1: 101, 2: 102}
            {0: 100, 1: 101, 2: 102, 3: 103}
            {0: 100, 1: 101, 2: 102, 3: 103, 4: 104}
            View Code

             

      • Pool #进程池的操作
        • 介绍:
          • 犹如一个书店,一本同样的书有3本,3个人取走后之后来的人想要获取到必须等待前3个人还书后才可获得。
        • 使用:
          • poll.apply(函数,参数) #在进程池中申请一个进程去执行函数(申请一个进程执行一个再申请)

          • poll.apply_async(func=函数名,args=(参数,),callback=函数名2) #申请一个进程执行函数完成后执行函数名2,函数名2的参数是函数名执行完成后的返回值(直接全申请了,一起执行)

          • 代码:
            from multiprocessing import Pool
            import time
            def f1(i):
                time.sleep(2)
                return i+100
            
            def end_call(arg):
                print('end>>>',arg)
            
            
            if __name__ == '__main__':
                p = Pool(5) #创建一个线程池一共有5个线程
                for i in range(11):
                    p.apply_async(func=f1,args=(i,),callback=end_call)
                print('123123')
                p.close()
                p.join()
            
            执行结果:
            123123
            end>>> 100
            end>>> 101
            end>>> 102
            end>>> 103
            end>>> 104
            end>>> 105
            end>>> 106
            end>>> 107
            end>>> 108
            end>>> 109
            end>>> 110
            View Code
posted @ 2016-07-15 14:34  WuYongQi。  阅读(242)  评论(0编辑  收藏  举报