ホームページ >バックエンド開発 >Python チュートリアル >PythonでのThreadpoolスレッドプールタスク終了サンプルコードの詳細説明

PythonでのThreadpoolスレッドプールタスク終了サンプルコードの詳細説明

高洛峰
高洛峰オリジナル
2017-03-20 13:09:564216ブラウズ

要件

一連の 1 桁 (0 ~ 9) を処理する必要があります。それが奇数の場合は、それを ループ 出力する必要があります。偶数の場合は、対応する時間待つ必要があります。すべてのタスクを完了します。0 はエラーですが、タスクを終了する必要はなく、一部の処理をカスタマイズできます。

キーポイント

関数の定義処理要件

コールバック処理は結果を返します。スレッドプール

ステータスを制御するには、常に偶数と奇数のみが返されます。偶数と 0 の場合は、例外処理をキャッチします。

threadpoolはスレッドプールの同時実行性を定義する

実装

# -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process

例外定義と特別な値(0)定義

class Finish(SyntaxWarning):
    pass
class PauseInfo(SyntaxWarning):
    pass
pause_num = 0

func関数定義

0の場合はFalseを返し、それ以外の偶数はTrueを返す

def func(para):
    if para == pause_num:
        print('start for %d and wait %ds' % (para, 4))
        time.sleep(4)
        print('error bcs ',para)
        return False
    if para % 2 == 0:
        print('start for %d and wait %ds' % (para, para))
        time.sleep(para)
        print('stop for', para)
        return True
    while True:
        print('continue for', para)
        time.sleep(para)
コールバック定義

def callback(request, result):
    if result:
        raise Finish
    else:
        raise PauseInfo

スレッドプール処理

Finish はタスクの完了をマークし、再び例外を発生させてスレッド プールの処理を終了します。

def main_thread(paras):
    pool = ThreadPool(10)
    requests = makeRequests(callable_=func, args_list=paras, callback=callback)
    [pool.putRequest(req) for req in requests]
    while True:
        try:
            pool.wait()
        except Finish as e:
            raise SystemExit
        except PauseInfo as e:
            print('Pause bcs %d but will continue' % pause_num)
        except Exception as e:
            print('Unknown error so will quit')
            raise SystemExit
main 関数はテスト プロセスを開始します

if name == 'main':
    while True:
        s = input('Input number list to test and any other word to quit\n')
        paras = []
        for para in s:
            if para.isnumeric():
                paras.append(int(para))
            else:
                break
        try:
            thread_test = Process(target=main_thread, args=(paras,))
            thread_test.start()
            thread_test.join(timeout=20)
        except TimeoutError as e:
            print('task timeout')
        except Exception as e:
            print('unknow error:',e)
 

結果の検証

処理 108 は、出力からわかります。 1 はループで処理され、0 が処理されるとエラーが報告されます。8 が処理されるとタスクは終了します

テストする数値リストと終了するその他の単語を入力します

108
1 のために継続します
0 から開始して 4 秒待機します
8で開始して8秒待ち
1で継続
1で継続
1で継続
エラーbcs 0
1で継続
bcs 0を一時停止しますが継続します
1で継続
1で継続
1で継続
1で継続
8で停止
テストする数字のリストと終了する他の単語を入力してください

以上がPythonでのThreadpoolスレッドプールタスク終了サンプルコードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。