【问题标题】:Worker pool data structure工作池数据结构
【发布时间】:2018-11-08 12:32:49
【问题描述】:

我想知道多处理模块中是否有本地实现,允许我将正在运行的进程存储在基于列表的结构中,并且每当进程完成执行时,它会自动从列表中删除。

在代码中它看起来像这样:

from multiprocessing import process

pool = [] # This data structure needs to prune non-running processes

class A(Process):
     def run():
         pass

for i in range(0, 10):
    worker = A().start()
    pool.append(worker)


# So if I want to iterate the pool now, It should only contain the alive processes

另一种管理方法是保留字典:

pool = {
    processId: processObject
}

然后使用 psutil 获取活动进程 ID:

current_process = psutil.Process()
children = current_process.children(recursive=False)

但是,一旦进程终止,字典中对象的大小是多少?

【问题讨论】:

    标签: python python-3.x multiprocessing python-multiprocessing multiprocess


    【解决方案1】:

    我不认为这种假设的自我更新结构是一个好主意,对于同一个reason,您不应该在迭代列表时修改它。在您对池进行迭代时,进程可能会被删除。

    为了安全地迭代它,您需要一个快照,而这将使这种结构的全部工作变得毫无意义。当您需要更新您的池列表时,您最好明确地这样做,例如:

    pool[:] = [p for p in pool if p.is_alive()] # p are your processes

    或者,如果您想要所有进程范围内的活动子进程,而不仅仅是自定义池中的子进程:

    [p for p in multiprocessing.active_children()]

    您当然可以将它放在函数或方法中的某个位置,并在需要实际池列表时调用它。进程具有pid 属性,因此您不需要psutil 来获取进程ID。

    【讨论】:

    • 它不必是一个列表——它可以是一个字典。问题是,这是一个 Web 应用程序——我希望避免在每个请求上更新列表,因为并发可能会变得混乱——因为我必须在线性搜索期间阻止访问。并且工作进程的数量随着用户数量线性增长。
    • @Kristijan 谁需要池数据以及用于什么目的?
    • 我想通过 API 端点公开活动进程的进度。
    • @Kristijan 问题不在于构建这样的结构,而在于协调一致的读取访问。如果您只希望包含活动进程,它与字典没有区别。它总是需要更新,问题是它是在你真正需要该信息的时候发生的,还是在没有人要求它的时候发生的。您不能直接公开自更新结构,因为它的迭代可能会因删除数据集而失败。
    • @Kristijan 您要么需要读/写锁(在 stdlib 中不可用),要么(更好)某种带有快照的版本控制,基本上与数据库提供的确保一致性的功能相同。无论如何,您公开的数据结构在读取期间必须是静态的。这增加了很多复杂性。如果您认为可以回答您的问题,我可以向您展示一个自我更新的结构,但由于前面提到的原因,您不应该直接将其公开给阅读请求。不过,您可以使用它来触发真实数据库的更新。
    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多