簡體   English   中英

Python線程垃圾收集

[英]Python threads garbage collection

如果重新分配線程對象,是否正在運行的線程可以進行垃圾回收? 例如:

class A(threading.Thread)
    def run():
        while True:
            #Do stuff


a = A()
a.start()
time.sleep(60)
a = A()

在這一點上,即使線程A仍然在做東西,解釋器可以破壞原始的A()線程嗎? 如果確實如此,有沒有辦法防止這種情況發生?

我的猜測是否定的。 在Python用於跟蹤事物的任何結構中仍然存在對線程的引用。 我會測試它,但如果它不起作用我會感到驚訝。

編輯檢查出來:

#!/usr/bin/env python
import threading, time

class A(threading.Thread):
    def __init__(self, name):
            threading.Thread.__init__(self)
            self.name=name
            self.count=0
    def run(self):
            while self.count<10:
                    print self.name, "Running!"
                    time.sleep(1)
                    self.count+=1

a=A("first")
a.start()
time.sleep(5)
a=A("second")
a.start()
first Running!
first Running!
first Running!
first Running!
first Running!
second Running!
first Running!
second Running!
first Running!
first Running!
second Running!
first Running!
second Running!
first Running!
second Running!
second Running!
second Running!
second Running!
second Running!
second Running!

線程不會被刪除,但我想你的問題是線程無緣無故地消失了? 未處理的Exception會在不影響主線程的情況下終止線程! 它只將回溯打印到stderr,但你可能看不到......

如果存在對某個地方的對象的引用,則線程不會被垃圾收集。

請參閱https://hg.python.org/cpython/file/2.7/Lib/threading.py ,它會保留對線程對象的標簽。

# Active thread administration
_active_limbo_lock = _allocate_lock()
_active = {}    # maps thread id to Thread object
_limbo = {}

threading模塊在模塊變量中保留引用。 當你調用threading.enumerate()你正在迭代相同的變量。

當你調用start()它會在模塊變量中插入對Thread對象的引用,當run()終止時,它會清理引用。

暫無
暫無

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

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