如何在没有通信的情况下杀死Python线程

时间:2015-02-19 22:12:33

标签: python multithreading

我已经阅读了stackoverflow中的大多数类似问题,但没有人看到解决我的问题。我使用ctypes从dll文件调用函数。因此,我无法编辑dll文件的源代码以添加任何“结束循环”条件。此外,此功能可能会持续很长时间(如某些打印命令)。我需要设计一个“暂停”命令,以防在处理打印时出现紧急情况。我唯一能做的就是杀死线程。

2 个答案:

答案 0 :(得分:1)

强行杀死一个线程永远不会好。您的程序应该设计为干净地退出线程。

您可以在启动之前将其标记为“守护程序”。如果退出主线程,它将不会等待守护程序的线程。

终止线程仍然可以通过两种方式完成。您可以通过https://docs.python.org/2/c-api/init.html#c.PyThreadState_SetAsyncExc在线程中异步引发Python异常(如上所述,这需要构建一个C模块或使用ctypes使其工作)。 Windows上的另一种方法是调用Windows API TerminateThread()

  

TerminateThread用于导致线程退出。发生这种情况时,   目标线程没有机会执行任何用户模式代码。 DLL文件   附加到线程不会通知该线程   终止。系统释放线程的初始堆栈。

     

[...]

     

TerminateThread是一个危险的函数,只能用于   最极端的情况。只有你这样才能调用TerminateThread   确切知道目标线程正在做什么,并控制所有   目标线程当时可能正在运行的代码   终止。例如,TerminateThread可以导致   以下问题:......

我认为使用ctypes也应该可行。

答案 1 :(得分:0)

如果没有合作,你就无法安全地终止线程。线程在进程中不是孤立的,因此不安全地终止线程会污染进程。拜托,不要走这条路。

如果您需要这种隔离,则需要一个过程。您可以在没有合作的情况下安全地终止进程,但它可能会使进程正在处于中间状态的系统对象(例如文件)。在您的情况下,这可能意味着打印作业已完成一半,打印机中途有一页。或者它可能意味着临时文件无法删除。