停止在IronPython中运行的所有线程

时间:2013-06-05 03:18:16

标签: c# ironpython

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

4 个答案:

答案 0 :(得分:5)

简单的想法是将其作为Process

启动

你杀死Process之后,每Thread它也会被杀死。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你可以肯定地以相反的方式做到这一点。由于我不知道python,我只会分享这个想法。

  • 在系统中设置命名事件(您在Windows中,在c#中非常简单,搜索Mutex
  • 使用您的python主线程
  • 分享指定事件的名称
  • 在主python线程中设置一个终止标志,可由worker-python-threads
  • 访问
  • 设置worker-python-threads以偶尔监视此标志
  • 在主python线程中,也开始如下面的无限循环
  • 只要你想让它们死掉,就可以在c#thread中设置命名事件

伪代码:

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 ...