队列对象被子类化时,多处理队列无法按预期填充?

时间:2019-06-04 20:21:30

标签: python python-multiprocessing

考虑两个类,一个类是队列类,并由进程类继承。队列类本质上是一个多处理队列对象包装器。流程类继承了队列类,否则只是一个多处理流程对象包装器。

按预期,使用put函数填充多处理队列。如果我查看队列内容或查询qsize()值,则项目在队列中。但是,如果队列对象是在单独的流程(即multiprocessing.Process对象目标函数)中引用的,则该队列将永远被视为空。

文档指出,queue.Queue和multiprocessing.Queue填充都很慢。但是,即使我放入一个监视queue.empty或queue.qsize是否适用的循环,任务函数所引用的队列对象(类型为queue.Queue或multiprocessing.Queue)也不会填充。使用队列的类实例变量或将队列作为任务函数的参数传递不会改变问题。

因此,如果设计是:

ProcessClass,即multiprocessing.Process继承了QueueClass,即multiprocessing.Queue。例如“类ProcessClass(QueueClass):”

ProcessClass Task()函数(如果愿意)永远不会看到QueueClass.Queue对象项。该设计不起作用,如上所述。关于QueueClass中存在的队列对象的某些事情,可以投入使用但会失败,即,ProcessClass Task()函数将队列对象视为永远为空,这是一个“独立的”过程,无论队列对象如何传递或传递如何。由Task()函数引用。人们可能希望multiprocessing.Queue对象将是一个真正的共享对象,但事实并非如此。

我什至编写了自己的MyQueue类,该类基于一个简单的列表对象,没有阻塞逻辑,只是一个带有放置(附加列表),获取(弹出列表)和空函数的类。认为编写我自己的MyQueue类而不基于任何导入或定义的对象,将使我对当前的问题有一些了解。但是,即使使用我自己的MyQueue类,即ProcessClass(MyQueueClass)也表现出与multiprocessing.Queue对象完全相同的问题。如上所述。


但是,如果设计是:

ProcessQueueClass(对象) -利用multiprocessing.Process对象 -利用multiprocessing.Queue对象 在同一个班级上。

ProcesQueueClass Task()函数(如果需要)将在multiprocessing.Queue对象项目中查看这些项目。设计按预期工作。


有很多代码说明了此问题,其中类中的对等层对象起作用,而继承的子类中的分层对象却不起作用。所以,我知道我已经解决了这个问题。但是要在此处复制代码,考虑到两个测试用例的长度,这似乎是一种滥用。每个方案有100多行代码。

所以问题是,我似乎找不到这种情况的任何具体记录的原因?仅涉及一些并行过程存在问题的已知问题的一些引用。队列对象的填充速度较慢,但​​这是核心问题,因为在放置项目后立即检查队列时,该队列已填充。实际上,这是单独的任务过程,永远不会获得队列对象的填充实例。

我没有将继承的类视为并行进程。它本身不是线程或进程。但这在某种程度上似乎是事实?关于python引擎的设计有什么可以解释以上内容?

0 个答案:

没有答案