【发布时间】:2011-11-02 11:44:50
【问题描述】:
我有如下代码,
class _Process(multiprocessing.Process):
STOP = multiprocessing.Manager().Event()
def __init__(self, queue, process_fn):
self._q = queue
self._p = process_fn
super().__init__()
def run(self):
while True:
dat = self._q.get()
if not dat is _Process.STOP:
self._p(dat, self._q)
self._q.task_done()
else:
self._q.task_done()
break
但是,我无法成功比较 STOP。当我使用 is 时,这并不奇怪,因为我相信 is 比较对象 ID 和文档 " ...这是内存中对象的地址。" 所以,由于我使用多个进程,内存地址会有所不同。 (不过,我也无法将其与 == 进行比较,我不确定这是为什么)。
我用Manager() 创建的任何对象都会发生这种情况,但如果我使用“真正的”单例(True 或False 或None)它确实有效。尽管这不是一个合适的解决方案,因为这些值中的任何一个都可能在队列中有效。
那么如何创建一个变量,比如单例,可以跨进程进行比较?
(注意,我也尝试过使用专用类,但收到关于无法腌制的错误。)
更新: 答案似乎是使用一个类,但我收到了腌制问题,因为我只尝试使用内部类。将其移至模块范围修复了错误并且工作正常。 - 谢谢@Schnouki!
这是代码的一个示例(并且毫无意义)用法,它显示了错误...
def f(data, queue):
print(data)
q = multiprocessing.JoinableQueue()
for i in range(4):
p = _Process(q, f)
p.daemon = True
p.start()
q.put(i)
q.join()
for i in range(4):
q.put(_Process.STOP)
q.join()
【问题讨论】:
标签: python process python-3.x multiprocessing