PythonマルチスレッドTimerタイマー/遅延実行、イベントイベント
Timer継承子Thread類は、Threadのサブクラスであり、スレッド類でもあり、スレッドの能力と特徴があります。このクラスはどのぐらいの頻度で関数を実行するかを定義します。
その例は、ターゲット関数を実行するスレッドを遅延させることができ、ターゲット関数を実行する前に、キャンセルすることができる。
Timerソース:
事前キャンセル:
==end=====
startメソッドの実行後、Timerオブジェクトは待機状態となり、10秒後にadd関数が実行されます。一方、add関数を実行する前の待機段階では、主スレッドはサブスレッドのcancel方法を使用すると、実行関数がスキップされて終了します。
イベントを使用してTimerタイマーを実現します。
WARNING:root:9
Eventイベントは、スレッド間通信機構の中で最も簡単に実現され、内部のフラグflagsを使用して、flagsのTrueまたはFalseの変化によって操作される。
イベントソース:
クラスイベント:
•セット() flagsはTrueに設定されています
•clear() flagsはFalseに設定されています
•is_セット() フラグはTrueかどうか、ブール値に戻ります。
•wait(timeout=None) フラッグがTrueに変わるまで待つ時間を設定します。Noneは無限に待ちます。Trueに戻ると、タイムアウトを待たずにFalseに戻ります。
例:
主人は労働者を雇ってコップを生産させました。主人は10個のコップを生産するまで労働者を待っていました。
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:I finished my job.10
INFO:root:Good job.
社長と労働者は同じEventオブジェクトのフラグを使います。
ボスwait()は最大30秒待ちで、フラグがTrueに変わるのを待っています。労働者は10杯分のコップを作る時、flagsをTrueに設定します。労働者は30秒以内にコップを作らないといけません。
waitの使用:
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
Man Exit.
waitとsleepの違いは、waitがアクティブにタイムプレートを譲ってくれます。他のスレッドがスケジュールされていますが、sleepはタイムプレートを使って譲れません。
リボン:
TimerタイマーはThread類から継承されており、スレッド類でもあります。n秒後にあるターゲット関数を実行すると、キャンセルがキャンセルされます。
Eventイベントは、TrueとFalseがフラグ値を維持し、このマークの値によって何かを決めるもので、wait()メソッドは、flagsを一番長く待ってTureに設定することができます。タイムアウトはTrueに設定されていないままFalseに戻ります。
PS:次はpythonのタイマーTimerを見ます。
timer類
Timer(タイマー)はThreadの派生類で、指定された時間後に一つの方法を呼び出すために使用されます。
構造方法:
TimerはThreadから派生して、実例の方法を増加していません。
例一:
締め括りをつける
以上述べたのは、PythonマルチスレッドTimerタイマー/遅延実行、Eventイベントの詳細な解説です。皆様のご協力をお願いします。もし何かご質問があれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。
本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。
その例は、ターゲット関数を実行するスレッドを遅延させることができ、ターゲット関数を実行する前に、キャンセルすることができる。
Timerソース:
class Timer(Thread):
def __init__(self, interval, function, args=None, kwargs=None):
Thread.__init__(self)
self.interval = interval
self.function = function
self.args = args if args is not None else []
self.kwargs = kwargs if kwargs is not None else {}
self.finished = Event()
def cancel(self):
"""Stop the timer if it hasn't finished yet."""
self.finished.set()
def run(self):
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.set()
Timer類の使用方法は、Thread定義子スレッドと同じで、interval着信間隔時間、function着信スレッド実行の関数、argsとkwargs着信関数のパラメータです。事前キャンセル:
import threading
import time
def add(x,y):
print(x+y)
t = threading.Timer(10,add,args=(4,5))
t.start()
time.sleep(2)
t.cancel()
print("===end===")
実行結果:==end=====
startメソッドの実行後、Timerオブジェクトは待機状態となり、10秒後にadd関数が実行されます。一方、add関数を実行する前の待機段階では、主スレッドはサブスレッドのcancel方法を使用すると、実行関数がスキップされて終了します。
イベントを使用してTimerタイマーを実現します。
import threading
import logging
import time
logging.basicConfig(level=logging.INFO)
# class MyTimer(threading.Thread):
class MyTimer:
def __init__(self,interval,fn,args=None):
self.interval = interval
self.fn = fn
self.args = args
self.event = threading.Event()
def start(self):
threading.Thread(target=self.__do).start()
def cancel(self):
self.event.set()
def __do(self):
self.event.wait(self.interval)
if not self.event.is_set():
self.fn(*self.args)
def add(x,y):
logging.warning(x+y)
t = MyTimer(5,add,(4,5))
t.start()
# time.sleep(2)
# t.cancel()
実行結果:WARNING:root:9
Eventイベントは、スレッド間通信機構の中で最も簡単に実現され、内部のフラグflagsを使用して、flagsのTrueまたはFalseの変化によって操作される。
イベントソース:
クラスイベント:
def __init__(self):
self._cond = Condition(Lock())
self._flag = False
def _reset_internal_locks(self):
self._cond.__init__(Lock())
def is_set(self):
return self._flag
isSet = is_set
def set(self):
with self._cond:
self._flag = True
self._cond.notify_all()
def clear(self):
with self._cond:
self._flag = False
def wait(self, timeout=None):
with self._cond:
signaled = self._flag
if not signaled:
signaled = self._cond.wait(timeout)
return signaled
イベントの方法:•セット() flagsはTrueに設定されています
•clear() flagsはFalseに設定されています
•is_セット() フラグはTrueかどうか、ブール値に戻ります。
•wait(timeout=None) フラッグがTrueに変わるまで待つ時間を設定します。Noneは無限に待ちます。Trueに戻ると、タイムアウトを待たずにFalseに戻ります。
例:
主人は労働者を雇ってコップを生産させました。主人は10個のコップを生産するまで労働者を待っていました。
import threading
import logging
import time
logging.basicConfig(level=logging.INFO)
cups = []
event = threading.Event()#event
def boss(e:threading.Event):
if e.wait(30):# 30
logging.info('Good job.')
def worker(n,e:threading.Event):
while True:
time.sleep(0.5)
cups.append(1)
logging.info('make 1')
if len(cups) >=n:
logging.info('I finished my job. {}'.format(len(cups)))
e.set()#flag True
break
b = threading.Thread(target=boss,name='boos',args=(event,))
w = threading.Thread(target=worker,args=(10,event))
w.start()
b.start()
実行結果:INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:make 1
INFO:root:I finished my job.10
INFO:root:Good job.
社長と労働者は同じEventオブジェクトのフラグを使います。
ボスwait()は最大30秒待ちで、フラグがTrueに変わるのを待っています。労働者は10杯分のコップを作る時、flagsをTrueに設定します。労働者は30秒以内にコップを作らないといけません。
waitの使用:
import threading
import logging
logging.basicConfig(level=logging.INFO)
def do(event:threading.Event,interval:int):
while not event.wait(interval): # not event.wait(1) = True
logging.info('To do sth.')
e = threading.Event()
t = threading.Thread(target=do,args=(e,1))
t.start()
e.wait(10) # time.sleep(10)
e.set()
print('Man Exit.')
実行結果:INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
INFO:root:To do sth.
Man Exit.
waitとsleepの違いは、waitがアクティブにタイムプレートを譲ってくれます。他のスレッドがスケジュールされていますが、sleepはタイムプレートを使って譲れません。
リボン:
TimerタイマーはThread類から継承されており、スレッド類でもあります。n秒後にあるターゲット関数を実行すると、キャンセルがキャンセルされます。
Eventイベントは、TrueとFalseがフラグ値を維持し、このマークの値によって何かを決めるもので、wait()メソッドは、flagsを一番長く待ってTureに設定することができます。タイムアウトはTrueに設定されていないままFalseに戻ります。
PS:次はpythonのタイマーTimerを見ます。
timer類
Timer(タイマー)はThreadの派生類で、指定された時間後に一つの方法を呼び出すために使用されます。
構造方法:
Timer(interval, function, args=[], kwargs={})
interval:
function:
args/kwargs:
実例的な方法:TimerはThreadから派生して、実例の方法を増加していません。
例一:
# encoding: UTF-8
import threading
def func():
print 'hello timer!'
timer = threading.Timer(5, func)
timer.start()
スレッドが5秒遅れたら実行します。締め括りをつける
以上述べたのは、PythonマルチスレッドTimerタイマー/遅延実行、Eventイベントの詳細な解説です。皆様のご協力をお願いします。もし何かご質問があれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。
本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。