この記事では、2つのシーンのスレッド制御に取り組みます
1.スレッド・ディレイ:所定の時間を遅らせ、その後、次を実行します
2.スレッドの実行時間が割り当てられた時間を超えた二つのスレッド、他のスレッドの実行
シナリオ1:タイマ
フォローアップを具体的に参照して私のブログを書きます
シナリオ2:マルチスレッドベースクラスの継承
DelayAction:書き換えrunメソッドは、実行の遅れ
DelayAction2:書き換えrunメソッド、実行の遅延、および出力を得ます
クラスDelayAction(threading.Thread): #1 遅延機能の実装 DEFの __init__(自己、秒、FUNC、* 引数) 。threading.Thread __init__ (自己) self.sec = 秒 self.func = FUNC self.args = 引数 DEF RUN(セルフ): time.sleep(self.sec) 適用(self.func、self.args) クラスDelayAction2(threading.Thread): #1 ディレイ機能の実装、およびリターンキャプチャする DEFの __init__を(自己、秒、FUNC、* 引数): 。threading.Thread __init__(自己) self.sec = 秒 self.func = FUNC self.args = 引数 self.res = なし デフ実行(自己): time.sleep(self.sec) self.res = (self.func、self.argsを適用) 場合 __name__ == ' __main__ ' : ###テストDelayAction用 デフmyfunc関数(X): プリント(X) リターン 1 DA = DelayAction(10、myfunc関数、222 ) da.start() #1 10Sの後にプリント222 ###テストDelayAction2 DA2 = DelayAction2(10、myfunc関数、333 ) da2.start() #1 10Sの後にプリント333 プリント(da2.res) #直ちになし、 "印刷"をプレイ並列スレッドとDA2であります関数はそれを強制していないので、むしろ関数値よりも、Noneをプリントアウトしていない理由 )(da2.join 印刷(da2.res) #をバンド機能を終えた後、1をプリントアウトし、
シーン1と2:装飾的な実装
タイムアウト:簡単な例では、その後の比較を容易にするために、
timeout2:コールバック関数の実行を遅らせるためにタイマーが、しかし、機能飾られていたと遅延がt.joinと一緒に実現されている場合、遅れることはありません
timeout3:オーバー所定の時間内にこの機能を実行しない場合、私は、機能を実行するために必要な、強制終了、待機中のWebに類似:このようなシナリオを解決
//これは、障害の例は、コールバックを返し、最後は全体の機能がありません。
timeout4:上記のシナリオを解決するために、スレッドデーモンを追加
DEF タイムアウト(FUNC): #装飾機能はパラメータで装飾されている デフmyfunc関数(秒): time.sleep(秒) FUNC() 戻りmyfunc関数 DEF timeout2(秒、コールバック): #1 パラメータでデコレータデコレータ DEF _deco(FUNC): T = Threading.Timer(秒、コールバック) #Threading.Timerタイマー、sec秒コールバック関数の後 t.start() t.join() DEFてmyfunc(アルギニン): #1 実際にはなかったことに注意これは単なるサンプルです、あなたはそのような関数で1行に自分たちのニーズに応じて拡張することができますプラスt.join()、myfunc関数を遅らせる FUNC(アルギニン) のリターンがMYFUNC 返す_deco DEFtimeout3(秒、コールバック): #このようなシナリオが存在する:上の所定の時間内にこの機能を実行しない場合、私は、機能を実行する必要があり、[要求]実装されていないこの機能の強制終了 DEF _deco(FUNC): T = Threading.Timer(秒、コールバック) #のコールバックは、10S用の端部と仮定する (t.start)を DEF myfunc関数(): FUNC() #は、関数が100Sの端部はと仮定添え 戻りMYFUNC 戻り_deco DEF :timeout4(コールバック、アルギニン)を #そのようなaが存在しますシーン:オーバー[]、所定の時間内に、この機能を実現する必要が強制終了し、この機能を実行しない場合、私は、機能を実行する必要が DEFの:_deco(FUNC) 、T = threading.Thread(対象=コールバック、引数の=を(アルギニン)) #のコールバック10Sの端を想定 t.setDaemon(真) #1 #必要があり、デーモンスレッド、メインスレッドmyfuncを同等 t.start() DEF てmyfunc(): FUNC() #は関数は、エンド100Sは想定してい添え 返すMYFUNC 戻る_deco のIF __name__ == " __main__ ' : ###テストタイムアウト @Timeout DEF :テスト() プリント(33で) #のテスト(10)#33を10秒の後に印刷されている ###テストtimeout2 DEF コールバック(): プリント(' callback2" ) Timeout2(@ 10 、コールバック) DEFのTEST2(X-): 印刷(X-) #1 TEST2(100)のすぐTEST2がすぐに実行され、#100をプリントアウトして、遅延がない #10秒後に、コールバックプリントアウトcallback2実行遅延に機能 #1 t.joinと相まって、10Sは直ちに二重遅延されたプリントcallback2 100、持っている場合#1 timeout2を #の実際のニーズ書き込みする方法については、ライン上の##ノート理解を ###テストtimeout3の DEFのコールバックを() : 印刷(' callback3 ' ) の戻り の@ timeout3( 10 、コールバック) DEF Test3は(): time.sleep( 100 ) 印刷(' Test3は' ) #10S後Test3は()#プリントアウトcallbak2がTest3はプリントアウトcallback3,100s後に #のここで#のTEST2を、実行されませんでした、なぜcallbak2のcallback3をプリントアウトし、私が説明しましょう #を## timeout4テスト DEFのコールバック(秒): time.sleep(秒) を印刷(「callback4 」) の戻り の@ timeout4(コールバックが、 100) #ここでは、100Sは自動的に終了し、デーモンスレッド、ライン10Sの終わりなので、メインスレッドがスレッド短時間で DEF TEST4() : time.sleep( 10 ) 印刷(' TEST4 ' ) TEST4()
時間の長さは、スレッドが保護者であることに注意してください。
ここでのデコレータの簡単な要約午前2時
1.デコレータ、機能が変更され、全ては、入力層のみFUNCである必要があります
2.装飾最初は、装飾および装飾機能デコは、常にトップレベルの関数である実行【課題上記「callbak2 callback3プリントアウト」を解決します]
インポートスレッディング DEFのtimeout2(秒、コールバック): #1 パラメータでデコレータデコレータ DEF _deco(FUNC): T = Threading.Timer(秒、コールバック) t.start() #1 t.join() DEF myfunc関数(アルギニン) : FUNC(アルギニン) のリターンはMYFUNC 返す_deco DEFのコールバック(): 印刷(' callback2 ' ) timeout2 @( 1、コールバック) #は今callback2を印刷して、終了 DEFのTEST2(X-): 印刷(X-)を
デコが自動的に行われている間は、任意の関数を実行しませんでした。
シナリオ2:簡単なバージョンを守るスレッド
インポート時間 インポートスレッディング DEF 関数func1(): time.sleep( 10 ) 印刷(' 関数func1 ' ) リターン 1つの。DEFの関数func2(): time.sleep( 20である) プリント(' 関数func2 ' ) リターン 2 DEF 試験(): T2 =スレッディング.thread(目標=関数func2) #デーモンスレッドとして遅いスレッド t2.setDaemon(TRUE) t2.start() 関数func1() 試験() # 10S印刷func1の後、スレッド速い、遅いスレッドは自動的に終了した場合
ここでは、出力関数func2を得るためのrunメソッドをオーバーライドすることができ、自分の要求を拡張しました。