■MultiprocessingのQueueは信用できないというコメントがリファレンスに見つかりました。
empty()
Return True if the queue is empty, False otherwise. Because of multithreading/multiprocessing semantics, this is not reliable.
ですので、ちゃんとしたいときは普通のQueueをインポートしないといけないようです。
勉強になりました。
プログラムの挙動はちゃんとしています。
もし意図と違っていれば、「破壊読み出し」を理解する必要があると思います。
元のコードをほんの少し(おせっかいな通知が出るように)修正しました。
Python3
1from multiprocessing import Queue
2
3def main():
4
5 test = Queue()
6
7 ############################
8 # 初期状態
9 print("Empty?",test.empty())
10 # Empty? True
11
12 ############################
13 # Queueに値を入れた
14 test.put(123)
15 print("PUT!")
16 # PUT!
17
18 ############################
19 # 値を入れた状態
20 print("Empty?",test.empty())
21 # Empty? False
22
23 ############################
24 # 値を破壊読み出しした
25 g = test.get()
26 print("GET g:",g)
27 # GET g: 123
28
29 ############################
30 # 破壊読み出しによって空になった状態
31 print("Empty?",test.empty())
32 # Empty? True
33
34if __name__ == "__main__":
35 main()
get()
をすると変数に中身が入り、Queueには値が1つしか入っていなかったため、(破壊読み出しによって)Queueの中身が空になります。
Queueに入っていた値を知りたいのであれば、get()
したときの変数g
をprint()
する必要があります。