【问题标题】:Stop all threads running in IronPython停止 IronPython 中运行的所有线程
【发布时间】:2013-06-05 03:18:16
【问题描述】:

如果我在 C# 线程中启动 IronPyThon 引擎,python 脚本将启动多个线程。但是,当我杀死 C# 线程时,python 脚本中的所有线程仍在运行。如何杀死 Python 脚本中的所有线程?

【问题讨论】:

  • 请展示您的代码 - 您如何启动引擎以及如何尝试杀死它
  • 你真的想杀死所有个线程吗?然后退出该过程;)
  • 如何“杀死”线程?通常不建议使用Thread.Kill 方法。搜索 SO 的原因(例如 here)。
  • @olidev - 你为什么忽略 cmets?

标签: c# ironpython


【解决方案1】:

简单的想法是以Process 开头,

在你杀死Process之后,它的每一个Thread也会被杀死。

【讨论】:

  • +1:不知道 IronPython 解释器在被强行取消存在时实际在做什么或不做什么,这很可能是最稳健的方式。也许在单独的应用程序域中运行它也足够了,但很难说。
【解决方案2】:

如果您确定要杀死它们,您要做的就是遍历进程列表并检查每个进程的父 ID。如果父 ID 与您启动的 IronPython 进程的 ID 相同,则将其终止。这将杀死与该进程关联的所有线程。像这样,其中 processes 是 Processes 的完整数组,而 parent 是您启动的 IronPython 进程:

private static void killProcessAndChildProcesses(Process[] processes, Process parent)
{
    foreach (Process p in processes)
    {
        if (p.GetParentProcessId() == parent.Id)
        {
            p.Kill();
        }
    }
    parent.Kill()
}

如果您担心 IP 子进程会产生自己的进程,则需要将其转换为递归解决方案。

【讨论】:

    【解决方案3】:
    1. 如果您的线程在每次迭代时循环执行某些操作,您可以设置一个 volatile 布尔标志,使其在完成当前迭代后退出(伪代码,因为我不熟悉 python):

          while shouldExit = false
      // do stuff
      
    2. 然后,当您希望线程停止时,只需将标志设置为 true,它将在下次检查条件时停止。 如果您不能等待迭代完成并且需要立即停止它,您可以选择 Thread.Abort,但请绝对确保您无法将打开的文件句柄、套接字、锁或其他类似的东西留在状态不一致。

    【讨论】:

      【解决方案4】:

      您可以肯定地以相反的方式进行。由于我不懂python,所以我只分享这个想法。

      • 在系统中设置命名事件(你在windows,c#很简单,搜索Mutex
      • 与您的 python 主线程共享命名事件的名称
      • 在主 python 线程中设置终止标志,可由 worker-python-threads 访问
      • 设置 worker-python-threads 以偶尔监控此标志
      • 同样在主 python 线程中,开始一个无限循环,如下所示
      • 只要你想死,就在 c# 线程中设置命名事件

      伪代码:

      while (Not(isNamedEventSet) && otherThreadsStillBusy)
      {
          // Do some magic to check the status of the event
          isNamedEventSet = ... 
      
          // rest for a while,
          // there is nothing better than a nap while other threads do all the hard work
          Sleep(100) 
      }
      

      我在 c#/c++ 之间做过类似的场景,到目前为止,它在所有情况下都取得了成功。我希望它适合 python..

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 1970-01-01
        • 2013-03-31
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多