当队列对象被子类化时,多处理队列未能按预期填充?

2024-05-14 08:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑两个类,一个类是一个队列类,并由进程类继承。queue类的核心基本上是一个多处理队列对象包装器。process类继承queue类,但在其他方面只是一个多处理流程对象包装器

多处理队列按预期填充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中存在的队列对象的某些信息,put起作用,但get失败,即ProcessClass Task()函数将队列对象视为永远为空,这是一个“单独”的进程,无论Task()函数如何传递或引用队列对象。人们可能会认为multiprocessing.Queue对象是真正的共享对象,但事实并非如此

我甚至编写了我自己的MyQueue类,它基于一个简单的列表对象,没有阻塞逻辑,只是一个带有put(append list)、get(pop list)和空函数的类。我认为在没有导入或定义对象的基础上编写自己的MyQueue类可以让我对当前的问题有一些了解。然而,即使使用我自己的MyQueue类,即ProcessClass(MyQueueClass),也会出现与multiprocessing.Queue对象完全相同的问题。如上所述


但是,如果设计是:

ProcessQueueClass(对象) -利用多处理.Process对象 -利用多处理队列对象 在同一个班级

函数的作用是:查看multiprocessing.Queue对象项中的项。设计工作如预期


有很多代码说明了这个问题,其中类中的对等级对象起作用,但继承子类中的分层对象不起作用。所以,我知道我已经限定了这个问题。但是在这里复制代码,考虑到这两个测试用例的长度,似乎是滥用。每个场景有100多行代码

所以问题是,我似乎找不到任何具体的文件证明为什么会这样?在多个并行进程存在问题的情况下,只需传递一些对已知问题的引用。队列对象填充速度较慢,但这是核心问题,因为当我在放置项目后立即检查队列时,会填充队列。实际上,单独的任务进程永远不会获得队列对象的已填充实例

我不认为继承的类是并行进程。它本身不是一个线程或进程。但在某种程度上似乎是这样的?python引擎的设计是否解释了上述内容


Tags: 对象函数代码核心task队列queueput

热门问题