Python之操作程序池技巧

2021-10-09 07:57:30 字數 3263 閱讀 2459

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。

初始化pool時,可以指定乙個最大程序數,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立乙個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池中有程序結束,才會用之前的程序來執行新的任務,請看下面的例項:

# -*- coding:utf-8 -*-from multiprocessing import poolimport os, time, randomdef worker(msg):t_start = time.time()print("%s開始執行,程序號為%d" % (msg,os.getpid()))# random.random()隨機生成0~1之間的浮點數time.sleep(random.random()*2)t_stop = time.time()print(msg,"執行完畢,耗時%0.2f" % (t_stop-t_start))po = pool(3)  # 定義乙個程序池,最大程序數3for i in range(0,10):# 每次迴圈將會用空閒出來的子程序去呼叫目標print("----start----")po.close()  # 關閉程序池,關閉後po不再接收新的請求po.join()  # 等待po中所有子程序執行完成,必須放在close語句之後print("-----end-----")執行結果:----start----0開始執行,程序號為214661開始執行,程序號為214682開始執行,程序號為214670 執行完畢,耗時1.013開始執行,程序號為214662 執行完畢,耗時1.244開始執行,程序號為214673 執行完畢,耗時0.565開始執行,程序號為214661 執行完畢,耗時1.686開始執行,程序號為214684 執行完畢,耗時0.677開始執行,程序號為214675 執行完畢,耗時0.838開始執行,程序號為214666 執行完畢,耗時0.759開始執行,程序號為214687 執行完畢,耗時1.038 執行完畢,耗時1.059 執行完畢,耗時1.69-----end-----
close():關閉pool,使其不再接受新的任務;

terminate():不管任務是否完成,立即終止;

join():主程序阻塞,等待子程序的退出, 必須在close或terminate之後使用;

如果要使用pool建立程序,就需要使用multiprocessing.manager()中的queue(),而不是multiprocessing.queue(),否則會得到一條如下的錯誤資訊:runtimeerror: queue objects should only be shared between processes through inheritance.

下面的例項演示了程序池中的程序如何通訊:

# -*- coding:utf-8 -*-# 修改import中的queue為managerfrom multiprocessing import manager,poolimport os,time,randomdef reader(q):print("reader啟動(%s),父程序為(%s)" % (os.getpid(), os.getppid()))for i in range(q.qsize()):print("reader從queue獲取到訊息:%s" % q.get(true))def writer(q):print("writer啟動(%s),父程序為(%s)" % (os.getpid(), os.getppid()))for i in "itcast":q.put(i)if __name__=="__main__":print("(%s) start" % os.getpid())q = manager().queue()  # 使用manager中的queuepo = pool()time.sleep(1)  # 先讓上面的任務向queue存入資料,然後再讓下面的任務開始從中取資料po.close()po.join()print("(%s) end" % os.getpid())執行結果:(11095) startwriter啟動(11097),父程序為(11095)reader啟動(11098),父程序為(11095)reader從queue獲取到訊息:ireader從queue獲取到訊息:treader從queue獲取到訊息:creader從queue獲取到訊息:areader從queue獲取到訊息:sreader從queue獲取到訊息:t(11095) end

python之程序池

初始化pool時,可以指定 個最 程序數,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立 個新的程序 來執 該請求 但如果池中 的程序數已經達到指定的最 值,那麼該請求就會等待,直到池中有程序結 束,才會建立新的程序來執行 3表示 程序池中對多有3個程序一起執行 pool pool 3...

python 程序 Python程序池

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool時,可以指定乙個最大程序數,當有新的請求提交到poo...

Python系列之程序池與執行緒池

在剛開始學多程序或多執行緒時,我們迫不及待地基於多程序或多執行緒實現併發的套接字通訊,然而這種實現方式的致命缺陷是 服務的開啟的程序數或執行緒數都會隨著併發的客戶端數目地增多而增多,這會對服務端主機帶來巨大的壓力,甚至於不堪重負而癱瘓,於是我們必須對服務端開啟的程序數或執行緒數加以控制,讓機器在乙個...