経緯
この辺を参考に解説されていることをやってみようかと思い。
実践
thread.py
import threading
class MyMessenger(threading.Thread): #inherits the thread built-in function
def run(self): #whenever you call this func. you need "def run"
for _ in range(10): #when you dont really wanna use the counter var. python convention. just to loop
print(threading.currentThread().getName())
x = MyMessenger(name='Send out messages')
y = MyMessenger(name='Receive messages')
x.start() #whenever you create thread, you wanna call start function
y.start() #goes to the class and looks for a func. called "run"
最初の何回かはAttributeError: 'module' object has no attribute 'Thread'
と怒られたがそれはファイルの名前をthreading.py
にしていたからだと発見。
動かしてみると
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
もう一度!
Send out messages
Send out messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Receive messages
Threadとは
簡単に言うとThreadを使えば、
x = MyMessenger(name='Send out messages')
y = MyMessenger(name='Receive messages')
でオブジェクトを作った後、
x.start()
y.start()
の2つの操作を(順番はあるものの)前者の完了を待たずに同時に行える。
上から下という順番があるからこのスクリプトを起動すると90%の確率でSend out messages
が最初に出る、んだと思う、多分。
つまり
for _ in range(10):
print(threading.currentThread().getName())
をx
とy
がほぼ同時にループをしていることになる。そのため毎回起動する度に順番が異なる。x.start()
によってSend out messages
という名前のthread
を作りfor loop
に入っていく。ただthread
は基本的には推奨されていないmethod。