読者です 読者をやめる 読者になる 読者になる

<Python> マルチスレッド

ちょっとだけ処理を早くしたいので、マルチスレッドmultithreadをやってみた。

In [36]: import threading

In [37]: def bbb(x):
    ...:     for i in range(1,1000):
    ...:         i = i + x
    ...:     print(i)
    ...:     

In [38]: t = threading.Thread(target=bbb(2))
1001

とやれば、手っ取り早く関数bbbをマルチスレッドで発行できるが、戻り値を受け取ることができないっぽい。
戻り値がほしい場合、クラスclassを作るっぽい。
ついでにスレッドthreadを10個ほど作ってリストにして、順次発行する処理を試してみた。

In [45]: class SampleThread(threading.Thread):
    ...:     def __init__(self,i):
    ...:         super(SampleThread, self).__init__()
    ...:         self.i = i
    ...:     def run(self):
    ...:         self.i = self.i + 1
    ...:         

In [46]: t = SampleThread(50)

In [47]: t.start()

In [48]: t.i
Out[48]: 51

In [49]: l = list()

In [50]: for i in range(10):
    ...:     t = SampleThread(i)
    ...:     l.append(t)
    ...:     

In [51]: l
Out[51]: 
[<SampleThread(Thread-11, initial)>,
 <SampleThread(Thread-12, initial)>,
 <SampleThread(Thread-13, initial)>,
 <SampleThread(Thread-14, initial)>,
 <SampleThread(Thread-15, initial)>,
 <SampleThread(Thread-16, initial)>,
 <SampleThread(Thread-17, initial)>,
 <SampleThread(Thread-18, initial)>,
 <SampleThread(Thread-19, initial)>,
 <SampleThread(Thread-20, initial)>]

In [52]: for v in l:
    ...:     v.start()
    ...:     

In [53]: for v in l:
    ...:     print(v.i)
    ...:     
1
2
3
4
5
6
7
8
9
10

うまくいった。 なるほどね。

マニュアル

17.1. threading — スレッドベースの並列処理 — Python 3.5.1 ドキュメント

いつものごとく、Stackoverflow

stackoverflow.com

ちなみに、できたスクリプトは、

time hage.py

で、手っ取り早く測定できる。