私は、pythonでキュー処理が不思議に思える場合があります。私が最初にそれを記述してみましょう:Python:プロセス内のスレッドでキュー処理を行う不思議
- メインスレッドは、グローバルオブジェクトがスレッドで開始されたメソッドを持っていることを
- (オブジェクトが内部のキューを持っている)のメッセージを収集し、処理するための責任があるグローバルオブジェクトを作成します。 (オブジェクトに属する)キューにアクセスし、そこからメッセージを読み取ります。
- メインスレッドは、メッセージをグローバルオブジェクトにパブリッシュする一連のプロセスを開始します(マルチプロセス。プロセスあり)。
問題:キュープロセッサのキューは常に空です。私はいくつかのコードに問題があることを示してみましょう:スクリプトの
import threading as t
import time
import sys
from multiprocessing import Process
if sys.version_info.major is 2:
import Queue as queue
else:
import queue
class ExampleRecorder:
queue = queue.Queue()
def run(self):
self.thread = t.Thread(target=self.start_processor)
self.thread.daemon = True
self.thread.start()
def start_processor(self):
while 1:
print("PROCESSOR! QUEUE ID: {}. QUEUE SIZE: {}. IS EMPTY: {}".format(id(self.queue), self.queue.qsize(), self.queue.empty()))
time.sleep(1)
def push_message(self, span):
self.queue.put(span)
print("RECORDER! QUEUE ID: {}. QUEUE SIZE: {}".format(id(self.queue), self.queue.qsize()))
er = ExampleRecorder()
er.run()
def producer():
while 1:
print("Adding an item")
er.push_message("foo")
time.sleep(1)
proc = Process(target=producer)
proc.start()
出力例は次のようになります。
$ python3 model.py
PROCESSOR! QUEUE ID: <queue.Queue object at 0x1095f9b70>. QUEUE SIZE: 0. IS EMPTY: True
Adding an item
RECORDER! QUEUE ID: <queue.Queue object at 0x1095f9b70>. QUEUE SIZE: 1
PROCESSOR! QUEUE ID: <queue.Queue object at 0x1095f9b70>. QUEUE SIZE: 0. IS EMPTY: True
Adding an item
RECORDER! QUEUE ID: <queue.Queue object at 0x1095f9b70>. QUEUE SIZE: 2
PROCESSOR! QUEUE ID: <queue.Queue object at 0x1095f9b70>. QUEUE SIZE: 0. IS EMPTY: True
あなたが見ることができるように、キューがオブジェクトを受信し、成長するが、プロセッサのために、それは常に空です。おそらくそこで何が間違っているのでしょうか? thread-in-a-processで共有キューを処理するのに手間がかかりますか?
P.S. Python 2.7.12と3.5.2でチェックしました
ありがとう:私たちは
queue
属性をテストする場合、我々は違いを見ます説明! – elgris