如果我在C#线程中启动IronPyThon引擎,python脚本将启动许多线程。但是,当我杀死C#线程时,python脚本中的所有线程仍在运行。如何杀死Python脚本中的所有线程?
答案 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)
如果您的线程在每次迭代时循环执行某些操作,您可以设置一个volatile布尔标志,使其在完成当前迭代后退出(伪代码,因为我不熟悉python):
while shouldExit = false
// do stuff
然后,当您希望线程停止时,将标志设置为true,并在下次检查条件时停止。 如果您不能等待迭代完成并需要立即停止它,您可以选择Thread.Abort,但要确保无法保留打开文件句柄,套接字,锁或其他类似的东西。不一致的状态。
答案 3 :(得分:0)
你可以肯定地以相反的方式做到这一点。由于我不知道python,我只会分享这个想法。
Mutex
)伪代码:
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 ...