簡體   English   中英

如何在沒有通信的情況下殺死Python線程

[英]How to kill a Python thread without communication

我已經閱讀了stackoverflow中的大多數類似問題,但是沒有人能解決我的問題。 我使用ctypes從dll文件調用函數。 因此,我無法編輯dll文件的源代碼以添加任何“結束循環”條件。 另外,此功能可能會持續很長時間(例如某些打印命令)。 我需要設計一個“暫停”命令,以防在處理打印過程中發生緊急情況。 我唯一能做的就是殺死線程。

強制殺死線程永遠都不是好事。 您的程序應設計為干凈地從線程退出。

您可以在啟動它之前將其標記為“守護程序”。 如果退出主線程,它將不會在守護線程上等待。

終止線程仍然可以通過兩種方式完成。 您可以通過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也應該可行。

沒有線程的配合,您無法安全地終止線程。 線程不是在進程內隔離的,因此不安全地終止線程會污染進程。 請不要走這條路。

如果需要這種隔離,則需要一個過程。 您可以安全地終止進程而無需其配合,盡管它可能會使正在處理的系統對象(例如文件)處於中間狀態。 在您的情況下,這可能意味着打印作業完成了一半,而打印機中途打印了一半。 否則可能意味着無法刪除臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM