多程序、程序池
阿新 • • 發佈:2019-02-05
- 多程序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)
- 程序池
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##############")