线程多进程中的对象为空
Object inside a threaded multiprocess is empty
我这里有一个奇怪的情况。我有一个多进程,它又有一个线程。这里的想法是将附加到队列的工作卸载到线程(我试图让我的 CPU 使用率达到每个 python 进程)。
无论如何,这是奇怪的部分。我将我的结果附加到双端队列,并在试图通过队列发送它的线程内。但是,即使对象 ID 相同,线程也看不到附加到双端队列的结果。
这是一些 code/output:
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 个项目。
知道为什么会这样吗?
问题是线程是在 init 中创建的。将创建移动到 运行 过程解决了这个问题。
我这里有一个奇怪的情况。我有一个多进程,它又有一个线程。这里的想法是将附加到队列的工作卸载到线程(我试图让我的 CPU 使用率达到每个 python 进程)。
无论如何,这是奇怪的部分。我将我的结果附加到双端队列,并在试图通过队列发送它的线程内。但是,即使对象 ID 相同,线程也看不到附加到双端队列的结果。
这是一些 code/output:
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 个项目。
知道为什么会这样吗?
问题是线程是在 init 中创建的。将创建移动到 运行 过程解决了这个问题。