我在这里有一个奇怪的情况。我有一个多进程,反过来有一个线程。这里的想法是将附加到队列的工作卸载到线程(我试图在每个python进程中获得CPU使用率)。
无论如何,这是奇怪的部分。我将我的结果附加到双端队列,并在线程内部尝试通过队列发送它。但是,即使对象id是相同的,线程也看不到附加到deque的结果。
这是一些代码/输出:
class QueueAppender(Thread):
def __init__(self, queue=None, read_deque=None, *args, **kwargs):
super(QueueAppender, self).__init__(*args, **kwargs)
self.queue = queue
self.contents = read_deque
def run(self):
while True:
print 'queue', id(self.contents), len(self.contents)
if self.contents:
results = self.contents.popleft()
if results is None:
return
self.queue.put(results)
else:
time.sleep(0.01)
class Worker(Process):
def __init__(self, queue=None, results=None):
super(Worker, self).__init__()
self.queue=queue
self.results = results # a Queue as well
self.read_deque = deque()
self.queuethread = QueueAppender(queue=self.results, read_deque=self.read_deque)
self.queuethread.start()
def run(self):
results = self.results
get_func = self.queue.get
reads = get_func()
while reads is not None:
result_batch = []
for read in reads:
# do some work here
result_batch.append(read)
self.read_deque.append(result_batch)
print 'worker', id(self.read_deque), len(self.read_deque)
reads = get_func()
self.read_deque.append(None)
self.t.join()
奇怪的部分是输出:
worker 140413597195744 6
queue 140413597195744 0
queue 140413597195744 0
queue 140413597195744 0
worker 140413597195744 7
queue 140413597195744 0
queue 140413597195744 0
queue 140413597195744 0
对我而言,这表示他们都访问相同的内存,但是当队列看到0项时,工作人员会看到其中的项目。
为什么会出现这种情况?
答案 0 :(得分:0)
问题是在 init 中创建了Thread。将创建移动到运行过程解决了这个问题。