マルチスレッドとマルチプロセスがあり、どちらがよいかは不明。

スレッドの衝突(競合)もある。

保守が難しくなるので、安易に使うべからず。

 

出典:

 

■サンプルコード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の中身を拾う。