マルチスレッドとマルチプロセスがあり、どちらがよいかは不明。
スレッドの衝突(競合)もある。
保守が難しくなるので、安易に使うべからず。
出典:
■サンプルコード1:ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
import time
def make_udon(kind):
print(' %sうどんを作ります。' % kind)
time.sleep(3)
return kind + 'うどん'
kinds = ['たぬき', 'かけ', 'ざる', 'きつね', '天ぷら', '肉']
executor = ThreadPoolExecutor(max_workers=3)
futures = []
for kind in kinds:
print('%sうどん オーダー入りました。' % kind)
future = executor.submit(make_udon, kind)
futures.append(future)
for future in futures:
print('%sお待たせしました。' % future.result())
executor.shutdown()
■サンプルコード2:threading
import time
import threading
def boil_udon():
print(' うどんを茹でます。')
time.sleep(3)
print(' うどんが茹であがりました。')
def make_tuyu():
print(' ツユをつくります。')
time.sleep(2)
print(' ツユができました。')
print('うどんを作ります。')
threa
d1 = threading.Thread(target=boil_udon)
thread2 = threading.Thread(target=make_tuyu)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print('盛り付けます。')
print('うどんができました。')
■スレッド間の協調作業にはQueueを使う
出典:
■スレッド間のデータ受け渡し
出典A1:共通変数
変数をmultiprocessing.Valueに変更して、
それ(ら)をスレッド間で共有するようにすれば良い。
from multiprocessing import Value
x = Value('i')
print(x.value)
with x.get_lock():
x.value += 1
print(x.value)
出典B1:Queue受渡し
from threading import Thread
from queue import Queue
import time
def thread1(threadname, q):
#read variable "a" modify by thread 2
while True:
a = q.get()
if a is None: return # Poison pill
print a
def thread2(threadname, q):
a = 0
for _ in xrange(10):
a += 1
q.put(a)
time.sleep(1)
q.put(None) # Poison pill
queue = Queue()
thread1 = Thread( target=thread1, args=("Thread-1", queue) )
thread2 = Thread( target=thread2, args=("Thread-2", queue) )
thread1.start()
thread2.start()
thread1.join()
thread2.join()
出典B2:Queue受渡し
機能Aの出力をQueueに入れて、機能BにQueueを引き渡してQueueの中身を拾う。