我怎样才能杀死所有线程?

新手上路,请多包涵

在这个脚本中:

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

原文由 Allexj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 536
2 个回答

不可以。不能强制终止单个线程(这是不安全的,因为它可能会保留锁,导致死锁等)。

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

  1. 将所有线程启动为 daemon 线程,主线程等待 Event / Condition 并且退出线程一旦设置 Event 或通知 Condition 。一旦(唯一)非 daemon 线程退出,进程终止,结束所有 daemon 线程
  2. 使用共享的 Event 所有线程间歇性地轮询,因此它们在设置后不久就协同退出。

原文由 ShadowRanger 发布,翻译遵循 CC BY-SA 3.0 许可协议

@Allexj:你从@ShadowRanger 那里得到了准确的答案。您可以如下所示进行操作。

 import threading, socket, sys

event = Threading.Event()   # define an Event

class send(threading.Thread):

    def run(self):
        try:
            global event
            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
            event.set()  # set the event as soon as any thread receives an keyboardInterrupt.

try:
    for x in range(800):
        send(daemon=True).start()
    event.wait()
except KeyboardInterrupt:  # If user pressed ctrl+c while loop was still running, then this will be useful
    pass
sys.exit(0)

原文由 Bhavesh Achhada 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题