スレッドプールキューキューの実装に基づいて、

記事の同期によるこの記事では、庭園をブログにプッシュされ、表示レイアウトが間違っている可能性があり、私を許してください!

こうして実現、より広いアプリケーションで並列にスレッドのマルチプロセス処理プールに利用可能なPythonで、Python2直接(に設けられたスレッドプール機能のpython3)スレッドプールのクラスを提供していない、およびスレッドプール:以前のテキストを書きますプロセスプール機能が必要です。ベースのキュー(待ち行列)関数は、スレッドプール機能を実現しています。

スレッドプール提供のpython3標準ライブラリでは、プールの処理機能を、標準ライブラリを使用することをお勧めします。

concurrent.futuresからThreadPoolExecutorをインポート
ProcessPoolExecutorをインポートconcurrent.futuresから

実装コード:

#は/ usr / binに/のpython3するENV! - * -コーディング:UTF-8 - * - 
__auth__ = "SongWei" 
インポートスレッド、キュー、時間の
 
クラススレッドプールを:
    '' '実装スレッドプールのキューキューに基づいて' '' 
 
    __init__をDEF (自己、max_thread = 1):
        '' 'キューを作成するプロセスを' '' 
        self.queue = Queue.Queue(MAXSIZE = max_thread)
 
    DEF適用します(セルフ、ターゲット=なし、引数=()、コールバック=なし、calljoin =真、** kwargsから):
        「」「:PARAMコールバックコールバック関数サブスレッド関数の終わりがコールバック関数に渡された値を返した後、実行している場合
            :PARAM calljoinブール値コールバック関数は、対象とコールバック関数が実行された場合にのみ、真デフォルトでは、プロセスのプールがブロックされています糸の端部が終了と見られた後に
            、他のパラメータ同じthreading.Threadクラスである
            注:ターゲットとコールバック関数が値を取得するメッセージ・キューの終了後に実行された場合にのみ(即ち、コールバック関数は、スレッドプールをブロックする) 
        「」' 
        でない場合コールバック:
            コールバック= self._callback
        threading.Thread = T(= self._decorateターゲット(ターゲット、コールバック、calljoin)、引数=引数、** kwargsから)の
        self.queue.put(T)
        t.start()
 
    :DEF参加(セルフ)
        '' ' 
            そこにメインスレッドのサブスレッドの終了が行われていないブロックされたスレッド・プール
            注:calljoinを=偽、それはコールバック関数を待ちませんメッセージキューを取得するために参加した後のみであるため、コールバックが実行されたときに
        「」 ' 
        (しばらくの間self.queue.qsize ):
            time.sleep(0.05)
 
    DEFの_decorate(セルフ、ターゲット、コールバック、calljoinは
        ):''「:paramがターゲット目的関数を受ける
            :コールバック関数のparamコールバックを受け入れるために
            :PARAM backjoin Boolean trueのコールバック関数とき場合そうでない場合は、キューが行わ目的関数解放された後、キューの終了後に解放されたとき
            の動作を、目的関数は以下のようにキュー(self.queque.get())、戻り値を取得するために実行された後、この機能には、すなわち、本質的にデコレータでありますコールバック関数をパラメータ。
        「'」
        warpper DEF(* argsを、** kwargsから):
            RES =ターゲット(* argsを、** kwargsから)
            calljoin IF:
                コールバック(RES)
                self.queue.get()
            他:
                self.queue.get()
                コールバック(RES)
            のリターンRESは、
        ラッパーを返す
 
    :(セルフ、* argsを、** kwargsから)DEFの_callbackを
        '' 'あなたは何もしないようにコールバック関数を通過しなかったとき' '' 
        パス
 
:呼び出し例を
result_list = [] 
DEF FUNC(アルギニン):
    印刷(「は実行S% '%をアルギニン)待っ
    time.sleep(10)
    のArgを返す
 
DEF戻る(RES)を:
    印刷(' Iは、データを取得しています:%S「%RES)
    result_list.append(RES)
 
プール=スレッドプール(max_thread = 20)
の範囲内のiについて(40):
    pool.apply(目標= FUNC、引数=(I)、コールバック=背面)
pool.join()
プリント(result_list)

おすすめ

転載: www.cnblogs.com/lazyfish007/p/11487443.html