【问题标题】:Multiprocessing with gui- cancelling processes带有 GUI 取消进程的多处理
【发布时间】:2021-05-25 01:45:08
【问题描述】:

我正在使用 python 开发一个 gui,其目的基本上是以不同的方式处理数据。

我目前有一个窗口用于设置“运行”,另一个窗口用于显示每次运行的状态(开始、运行、完成、错误等)。

我想添加一个功能,用户可以停止来自 gui 的任何进程。

我已经想出了如何添加按钮并将其与特定运行相关联,但我还没有想出如何真正停止进程。 我正在使用 python multiprocessing 来启动不同的任务,因为这也可以让我们最大限度地利用机器的资源。

pool_results = []
pool_results.append(pool.apply_async(func))

到目前为止,我遇到了 pool.terminate(),但这只会杀死所有子进程。

我还查看了 multiprocessing.active_children(),但这提供了对池创建的 workers 的引用,而不是提交到池的进程。工人是与 pid 等相关联的东西。

我还发现每个“池结果”都有一个属性“_job”,这是对进程添加到池中的顺序的引用,但似乎没有任何功能(隐藏或不隐藏)这允许我在将作业提交到池后取消它。

理想情况下,无论进程处于哪个阶段(在队列中等待、正在由工作人员处理等),我都可以取消它。

【问题讨论】:

    标签: python multithreading user-interface multiprocessing queue


    【解决方案1】:

    当您需要高级功能时,我倾向于建议从 Process 类开始,而不是使用像 Pool 这样的预先构建的东西。它使您可以更好地了解正在发生的事情,并且通常可以更容易(如果更冗长的话)实现更高级的行为。 Here's 我不久前写的一个答案,在那里我实现了自己的“池”以添加一些额外的功能。

    子进程可以通过多种方式终止/终止:

    • 问得好 :) 如果进程是某种循环,则在进程之间创建某种共享值,可以指示子进程退出循环并关闭。
    • 如果是daemonic,当父进程退出时,它会在所有子进程退出时尝试调用terminate
    • 您也可以随时自行调用terminatekill 进程(只要进程仍在运行)。这将导致孩子被毫不客气地“杀死”,而没有时间让atexittry: finally: 之类的东西运行。如果您这样做,请确保孩子没有任何资源,例如文件或lock 的打开或拥有自己的子进程,因为这些不会被正确清理。如果您想尝试任何形式的优雅清理,请参阅signal.signal 处理SIGTERM 信号(如果您曾经使用 ctrl-c 从命令行停止进程,您可能还想处理SIGINT)。李>

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2020-10-05
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2014-01-04
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多