2016-09-08 9 views
2

В этом сценарии:Как я могу убить все темы?

import threading, socket  

class send(threading.Thread): 

    def run(self): 
     try: 
      while True: 
       try: 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        s.connect((url,port)) 
        s.send(b"Hello world!") 
        print ("Request Sent!") 
       except: 
        s.close() 
     except KeyboardInterrupt: 
      # here i'd like to kill all threads if possible 

for x in range(800): 
    send().start() 

Можно ли убить все потоки в кроме KeyboardInterrupt? Я искал в сети и да, я знаю, что это уже было задано, но я на самом деле новичок в python, и я не очень хорошо разбирался в этом другом вопросе, заданном в стеке.

+0

Вы хотите убить все темы ... включает в себя основной поток и, как следствие, приложение? Если да, просто сделайте все свои потоки [daemons] (https://docs.python.org/3.4/library/threading.html#threading.Thread.daemon), а затем, когда вы хотите выйти, используйте 'sys.exit () '. – CristiFati

+0

@CristiFati: Это не поможет, если 'KeyboardInterrupt' доставлен в один из потоков (поток, который получает его, в основном случайный IIRC). Таким образом, необходимо предупредить основной поток, чтобы он мог «выйти» в соответствующее время. – ShadowRanger

+0

Right @ShadowRanger, спасибо за указание на это, потоки, как правило, проглатывают исключения. В качестве примечания, когда я занимаюсь потоками, я использую обратный подход: в цикле потока, если был нажат ключ (логика может быть расширена на основе ключа), завершите ее. – CristiFati

ответ

1

Нет. Отдельные нити не могут быть принудительно завершены (это небезопасно, поскольку они могут оставлять блокировки удерживаемыми, что приводит к взаимоблокировкам, между прочим).

Два способа сделать что-то вроде этого будет либо:

  1. ли все темы запущены как daemon нитей, с основным потоком, ожидающим на Event/Condition и выход, как только один из множества нитей Event или уведомляет Condition. Процесс завершается, как только заканчивается нить (единственная) не daemon, заканчивая все потоки daemon.
  2. Использовать общий Event, чтобы все опросы потоков прерывались, поэтому они совместно выходят вскоре после его установки.
+0

благодарит за ответ. Я видел 2 пути здесь: http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python, но я действительно не знаю, как реализовать это мой класс send(). – Sperly1987

+0

Вы используете свой код на _Win_ или _Ux_? – CristiFati

+0

Я работаю на Linux – Sperly1987