【问题标题】:How to recycle 'threading.Thread' objects in python?如何在 python 中回收“threading.Thread”对象?
【发布时间】:2021-09-25 20:44:31
【问题描述】:

我想知道如何在 python 中回收“threading.Thread”对象?

首先,我创建 (x) 个线程(“workers”)并存储在一个列表中。 我像往常一样开始他们,一旦他们完成就加入他们。 然后我从共享对象收集的数据中归档数据。 最后,我清除列表中的所有线程(“workers”),并在条件循环中重复此循环。

我似乎遇到的问题是线程对象即使在删除它们之后仍然存在。假设我使用 10 个线程,下次循环时我最终使用线程 11-20。

有没有办法在加入后终止第一个线程循环并有效地回收相同的线程?

亲切的问候,

安德鲁

【问题讨论】:

  • 线程ID不是密集序列:是什么导致“使用线程11-20”和“[线程对象]仍然存在”的断言? (一个线程结束——并且is_alive 被重置为 False——当它的 run 方法终止时。没有超时,join 保证等待这个条件并且线程“不再活动”并且实际Python 线程 wrapper 对象遵循正常的生命周期(和 GC)规则。)

标签: python-3.x multithreading


【解决方案1】:

“有没有办法在加入后终止第一个线程循环” - 不过,加入与终止相同。 the_thread.name 看起来像'Thread-N',其中N 是线程的“编号”,通常每个新线程都会增加。这并不一定意味着如果这个线程是'Thread-100',那么之前的99个线程还在运行。

加入线程意味着终止它,因此不会留下任何杂散线程运行。

示例

>>> import threading, time
>>> th = threading.Thread(target=lambda: time.sleep(10))
>>> th.start(); th.join()
>>> th.is_alive()
False # the thread is dead
>>> th.name
'Thread-1'
>>> th2 = threading.Thread(target=lambda: time.sleep(10))
>>> th2.start(); th2.join()
>>> th2.is_alive(), th2.name
(False, 'Thread-2') # This thread is dead alongside Thread-1
>>> 

您可以通过查看您的 Python 进程有多少线程来测试它(在任务管理器中或类似 top 的地方):

  1. 创建一个只挂在那里一段时间的线程:

    th = threading.Thread(target=lambda: time.sleep(10))
    
  2. 启动线程并等待它:th.start(); th.join()

  3. 线程运行时,在任务管理器中快速定位Python进程

  4. 它应该有 2 个操作系统线程在运行(Python 实际上为每个运行的 threading.Thread! 创建操作系统线程)

  5. 一旦线程退出,Python 进程将只有一个 OS 线程——主解释器线程。

  6. 因此,您创建的线程终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2017-04-30
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多