【问题标题】:How can I kill all threads?我怎样才能杀死所有线程?
【发布时间】:2017-01-15 18:55:44
【问题描述】:

在这个脚本中:

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 真的很陌生,我对堆栈上提出的其他问题的方法不太了解。

【问题讨论】:

  • 你想杀死所有线程...这是否包括主线程和应用程序?如果是这样,只需将所有线程设为daemons,然后当您想退出时,使用sys.exit()
  • @CristiFati:如果KeyboardInterrupt 被传递到其中一个线程(接收它的线程基本上是随机的 IIRC),那将无济于事。因此需要提醒主线程以便它可以在适当的时间exit
  • 对@ShadowRanger,感谢您指出这一点,线程往往会吞下异常。需要说明的是,当我在处理线程时,我使用相反的方法:在线程的循环中,如果按下了一个键(可以根据键扩展逻辑),则结束它。
  • 不可能!插座为外螺纹。设置自动终止的超时值。如何处理*socket.errorwhile True 是个坏主意,while some_status_bolean 更好!

标签: python multithreading python-3.x kill terminate


【解决方案1】:

没有。不能强制终止单个线程(这是不安全的,因为它可能会保持锁定状态,从而导致死锁等等)。

做这样的事情的两种方法是:

  1. 让所有线程作为daemon 线程启动,主线程在Event/Condition 上等待,并在其中一个线程设置Event 或通知Condition 时立即退出。只要(唯一的)非daemon 线程退出,进程就会终止,结束所有daemon 线程
  2. 使用共享的Event,所有线程都会间歇性地轮询,因此它们在设置后不久就会合作退出。

【讨论】:

  • 感谢您的回答。我在这里看到了 2 种方式:stackoverflow.com/questions/323972/… 但我真的不知道如何在我的 send() 类中实现它。
  • 我在 Linux 上运行
  • 所以?任何人都可以帮助我,或者在键盘中断中添加杀死线程是不可能的?
  • @allexj:你不能杀死线程,就像我已经说过的那样。使用共享的Event,将while True: 更改为while not myevent.is_set():,并停止在循环内使用裸except(它将捕获KeyboardInterrupt 阻止您处理它;捕获Exception 等)。然后当你捕获KeyboardInterrupt 时,调用myevent.set() 告诉所有其他线程停止处理它们的下一个循环。这并不难适应,如果它不能立即起作用,请尝试使用它。
猜你喜欢
  • 2021-03-04
  • 2011-08-20
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多