【问题标题】:How to kill C pthreads created by python ctypes.LoadLibrary如何杀死由 python ctypes.LoadLibrary 创建的 C pthreads
【发布时间】:2021-10-19 13:59:37
【问题描述】:

我正在使用的模块通过__init__ 中的ctypes.LoadLibrary 加载C 库,并调用一个使用pthread_create C api 创建两个进程的函数。线程 ID 不存储在任何地方。这些进程包含读取和写入串行端口的while(1) 循环。我希望能够杀死库线程,将所述串行端口用于其他目的,然后使用importlib.reload 恢复模块功能。现在串口仍然无法访问,直到我用 ctrl+c 杀死 python 最顶层的脚本。

【问题讨论】:

  • 您的进程中是否有其他线程在运行?
  • 你的意思是python线程吗?是的,python 模块被派生自 threading.Thread 的 python 类使用。
  • 要清楚,你不是要杀死子进程,你需要杀死两个具有未知 ID 的线程,在未指定数量的其他线程中,全部或部分可能无法区分你要杀的那两个?
  • 您可以在调用库init之前使用this answer枚举并记录现有线程,然后再次枚举,找到两个新添加的线程,但这取决于其他线程而不是还在后台产生新线程。
  • 我不知道python线程与在C库中使用pthread创建的线程有什么不同,希望ctypes中有一些机制可以列出用它创建的所有线程。

标签: python c multithreading


【解决方案1】:

没有它的合作,你不能杀死一个线程。它绝对行不通。你有两个选择:

  1. 更改库或模块的代码,使其支持干净关闭并且线程自行终止。这将需要更改 while(1) 循环,以便它们可以退出。

  2. 将库或模块隔离到自己的进程中。您可以安全地从外部进入以终止进程或编写代码以从内部终止进程,而无需更改库或模块。

如果可行的话,将不支持完全关闭的代码修复为支持完全关闭是更好的选择。但有时很难为没有它的复杂代码添加对干净关闭的支持。在理想情况下,每个程序员都会在每个库或模块中设计对干净关闭的支持。

【讨论】:

    【解决方案2】:

    因为您没有保存对线程的引用。你不能专门杀死它。最简单、最可靠的方法是将线程 ID 保存在某处。

    一些 cmets 谈论列出线程来杀死它们。不要那样做!您无法分辨哪个线程是您自己的,并且杀死其他线程并不好。只需保存 ID,它既简单又可靠。

    【讨论】:

    • OP 已经指定不能保存 ID,它们是由第三方库创建的。如果其他线程没有产生额外的线程,那么在创建这些 Id 后发现它们将不是问题。
    • 依赖没有其他线程被产生是非常脆弱的。 glibc 本身使用 AIO 生成线程,也许只有 Python 解释器也这样做。最好的解决方案是修复 C 代码设计缺陷或使用另一个模块。作为解决方案,这似乎很粗鲁,但解决问题的根源比猜测游戏更简单、更可靠。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2022-12-05
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多