Ich habe versucht, eine Bibliothek (Common Thread) zu verwenden, die die Verwendung des Python-Threading-Pakets vereinfacht. https://pypi.org/project/commonthread/ Es ist genauer zu versuchen, es zu verwenden oder es zu machen.
So installieren Sie das Commonthread-Paket
pip install -U commonthread
01.py
from commonthread import *
# source https://techacademy.jp/magazine/28155
def fibonacci_worker(th: WorkerThread, n: int):
if n <= 2:
return 1
else:
return fibonacci_worker(th, n - 2) + fibonacci_worker(th, n - 1)
thread = WorkerThread(fibonacci_worker, 36)
thread.name = 'tfib'
thread.start()
success = thread.join(timeout=0.5)
print('success={}'.format(success))
success = thread.join()
print('success={}'.format(success))
print('result={}'.format(thread.result))
print('elapsed={}'.format(thread.elapsed))
print(thread)
01.py Ausführungsergebnis
success=False
success=True
result=14930352
elapsed=3.688599109649658
WorkerThread(name=tfib, result=14930352, elapsed=3.688599109649658, args=(36,), kwargs={}, params={})
thread.join ()
drucke ich thread.result
und thread.elapsed
. Der von der Worker-Funktion fibonacci_worker zurückgegebene Wert wird automatisch im Ergebniselement des WorkerThread-Objekts gespeichert. Zusätzlich wird die verstrichene Zeit, die zum Ausführen der Worker-Funktion fibonacci_worker benötigt wird, im verstrichenen Element gespeichert.Manchmal möchte ich einen Rückgabewert von einer Worker-Funktion zurückgeben, daher ist er für diesen Zweck optimiert.
02.py
from commonthread import *
# source https://techacademy.jp/magazine/28155
class FibonacciThread(CommonThread):
def entry(self, n: int):
if n <= 2:
return 1
else:
return self.entry(n - 2) + self.entry(n - 1)
thread = FibonacciThread(36)
thread.name = 'tfib'
thread.start()
thread.join()
print('result={}'.format(thread.result))
print('elapsed={}'.format(thread.elapsed))
print(thread)
02.py Ausführungsergebnis
result=14930352
elapsed=4.399198055267334
FibonacciThread(name=tfib, result=14930352, elapsed=4.399198055267334, args=(36,), kwargs={}, params={})
class FibonacciThread (CommonThread)
zu definieren, erweitern Sie die CommonThread-Klasse.03.py
from commonthread import *
class AddThread(CommonThread):
def __init__(self, x: int, y: int):
CommonThread.__init__(self)
self.x = x
self.y = y
def entry(self):
time.sleep(2.0)
return self.x + self.y
thread = AddThread(11, 22)
thread.start()
thread.join()
print('result={}'.format(thread.result))
print('elapsed={}'.format(thread.elapsed))
print(thread)
03.py Ausführungsergebnis
result=33
elapsed=2.0015878677368164
AddThread(name=Thread-1, result=33, elapsed=2.0015878677368164, args=(), kwargs={}, params={})
04.py
from commonthread import *
lg = CommonThreadLogger()
lg.setup_basic()
class ShortThread(CommonThread):
def entry(self, duration):
lg.debug('start')
time.sleep(duration)
lg.debug('end')
return 'finished'
class LongThread(CommonThread):
def entry(self, duration):
lg.debug('start')
time.sleep(duration)
lg.debug('end')
return 'finished'
lg.debug('start')
sth1 = ShortThread(1.0); sth1.name = 'sth1'
sth2 = ShortThread(1.5); sth2.name = 'sth2'
lth1 = LongThread(5.0); lth1.name = 'lth1'
lth2 = LongThread(6.0); lth2.name = 'lth2'
sth1.start()
sth2.start()
lth1.start()
lth2.start()
lg.debug(CommonThread.list_alive())
CommonThread.join_all(type=ShortThread)
lg.debug(CommonThread.list_alive())
CommonThread.join_all()
lg.debug(CommonThread.list_alive())
04.py Ausführungsergebnis
MainThread: start
sth1: start
sth2: start
lth1: start
lth2: start
MainThread: [ShortThread(name=sth1, result=None, elapsed=0.0, args=(1.0,), kwargs={}, params={}), ShortThread(name=sth2, result=None, elapsed=0.0, args=(1.5,), kwargs={}, params={}), LongThread(name=lth1, result=None, elapsed=0.0, args=(5.0,), kwargs={}, params={}), LongThread(name=lth2, result=None, elapsed=0.0, args=(6.0,), kwargs={}, params={})]
sth1: end
sth2: end
MainThread: [LongThread(name=lth1, result=None, elapsed=0.0, args=(5.0,), kwargs={}, params={}), LongThread(name=lth2, result=None, elapsed=0.0, args=(6.0,), kwargs={}, params={})]
lth1: end
lth2: end
MainThread: []
lg.setup_basic ()
aus, wenn Sie nicht mehr debuggen müssen.CommonThread.join_all (type = ShortThread)
verbindet alle ShortThread-Instanzen und wartet darauf, dass sie beendet werden.CommonThread.join_all ()
verbindet alle CommonThread-Instanzen (einschließlich LongThread) und wartet, bis sie beendet sind.CommonThread.list_alive ()
gibt eine Liste aller aktiven (nicht abgeschlossenen) CommonThread-Objekte zurück.CommonThread.list_alive (type = ShortThread)
gibt eine Liste aller aktiven (nicht abgeschlossenen) ShortThread-Objekte zurück.Die Funktionen, die dieses Mal nicht eingeführt werden konnten, sind: