【发布时间】:2015-07-22 15:42:28
【问题描述】:
我在这里遇到了一个奇怪的情况。我有一个多进程,它又有一个线程。这里的想法是将附加到队列的工作卸载到线程(我正在尝试提高每个 python 进程的 CPU 使用率)。
无论如何,这是奇怪的部分。我将我的结果附加到一个双端队列,并在试图通过队列发送它的线程内。但是,即使对象 ID 相同,线程也不会看到附加到双端队列的结果。
这是一些代码/输出:
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 个项目。
任何想法为什么会发生这种情况?
【问题讨论】:
标签: python multithreading python-multiprocessing