2017-01-13 2 views
-1

Я работаю с роботом, использующим python. Я использую многопоточность (в этом случае два потока). И я хочу остановить поток A, когда поток B получает событие.Kill Python Thread

главная:

tA = threading.Thread(target=runThreadA) 
tA.setDaemon(True) 

tB = threading.Thread(target=runThreadB) 
tB.setDaemon(True) 

tA.start() 
tB.start() 

Тема A:

def runThreadA(): 
    print "Estado1" 
    time.sleep(5) 
    print "Finalizo Estado1" 
    return 'out1' 

Тема B:

def runThreadB(): 
    print "Estado2" 
    time.sleep(8) 
    print "Finalizo Estado2" 
    return 'a1' 

Мы хотим, чтобы убить нить B, когда поток А закончил, так что нить B не ждут еще 3 секунды.

спасибо.

+3

вам нужно будет показать нам часть вашего кода, идеальным было бы [mcve] с выделенными недостающими частями. –

+2

Возможный дубликат [Есть ли способ убить нить в Python?] (Http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python) – ppasler

ответ

1

Никогда не пытайтесь убить нить от чего-то внешнего к этой теме. Вы никогда не знаете, держит ли этот поток замок. Python не предоставляет прямой механизм для удаления потоков извне; однако вы можете сделать это , используя ctypes, но это рецепт тупика.

Эта цитата из Раймонда Хеттингера, есть об этом speech.

+1

+1, но я думаю, что вы можете прервать поток без ctypes, используя инспектирование и беспорядок с фреймами стека Python напрямую. У меня нет времени, чтобы проверить идею, но я думаю, что это должно быть возможно. Конечно, я согласен, что этого нельзя делать, кроме как в экстремальных ситуациях, и, конечно, управление GIL будет проблематичной частью здесь. Возможно, сбор мусора тоже. – Dalen