2016-12-10 2 views
4

Короче говоря ... что происходит, когда все ссылки на threading.Thread объекта теряются, например, в этой функции:Что происходит, когда вы теряете все ссылки на поток Python?

def myfunc(): 
    def thread_func(): 
     while True: 
      do_useful_things() 
    thethread = threading.Thread(target = thread_func) 
    thethread.run() 
    return 

Это своего рода выглядит как поток продолжает идти, но он ведет себя странно, и я подумал если могут произойти странные вещи, потому что сборщик мусора ненадлежащим образом удалил его или что-то в этом роде.

Как и в случае, если нить продолжает активно отслеживать их (я знаю, что threading сам имеет средства для получения активных потоков)?

+0

Если потоковая передача может получать активные потоки, то вы не потеряли ссылку на поток python. –

+0

Запуск потоков обычно (читайте: все языки GC: d, с которыми я знаком) рассмотрены GC-корни (т. Е. Они не мусор, и все, что они ссылаются - прямо и косвенно - тоже не мусор). –

ответ

2

Я не эксперт в области потоковой передачи, но из того, что мне известно, если вы назовете на нем thethread.run, он выполняет в текущем потоке (основной поток выполнения, тем самым блокируя выполнение), а затем умирает. В этом случае он получит мусор, собранный после завершения функции в качестве локальной переменной внутри этой функции.

Вместо этого, если вы используете thethread.start(), он отправляется в отдельный поток самостоятельно, где он выполняется. В этом случае, there's a mapping в threading модуле, который всегда держит ссылку на него:

_active = {} # maps thread id to Thread object 

так, в этом случае, всегда есть по крайней мере одна ссылка на нить, которую вы создали. Это в конечном итоге удаляется после выполнения его работы.

+0

Это была ошибка, которую я совершил. Упс. Хорошая информация в любом случае. – Schilcote