1. 程式人生 > >多程序、程序池

多程序、程序池

  1. 多程序Manager
    資料共享的方式只有兩種結構Value和Array。Python中提供了強大的Manage專門用來做資料共享的,其支援的型別非常多,包括,Value, Array,list,dict, Queue, Lock等。
    from multiprocessing import Process, Manager
    def func(dt, lt):
        for i in range(10):
            key = 'arg' + str(i)
            dt[key] = i * i
    
        lt += range(11, 16)
    if __name__ == "__main__":
        manager = Manager()
        dt = manager.dict()
        lt = manager.list()
    
        p = Process(target=func, args=(dt, lt))
        p.start()
        p.join()
        print(dt)
        print(lt)

  2. 程序池
    Pool可以提供指定數量的程序,供使用者呼叫,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到規定最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序。
    程序池
    阻塞和非阻塞的區別:
    Pool.apply_async 非阻塞,定義的程序池程序最大數可以同時執行。
    Pool.apply 一個程序結束,釋放回程序池,下一個程序才可以開始。
    import multiprocessing
    import time
    def fun(msg):
        print("############start######{0}".format(msg))
        time.sleep(3)
        print("########end########{0}".format(msg))
    
    if __name__=="__main__":
        pool = multiprocessing.Pool(processes=3)
        for i in xrange(1,6):
            msg = "hell{0}".format(i)
            pool.apply_async(fun,(msg,))
        print("#########start main########")
        pool.close()
        pool.join()
        #呼叫join之前,先呼叫close函式,否則會出錯。執行完close後不會有新的程序加入到pool,join函式等待所有子程序結束
        print("#########end main##############")