如何在python中终止正在运行的线程?

sac*_*bey 4 python sockets multithreading python-2.7

我在这段代码中使用套接字与其他机器连接。当我从其他机器收到消息时,我想终止线程,但如何在 Python 中终止线程?我参考了 Many SO Questions,我发现 python 中没有关闭线程的方法。谁能告诉我关闭线程的替代方法?

代码:

from threading import Thread
import time
import socket

def background(arg):
    global thread
    thread = Thread(target=arg)
    thread.start()

def display():
    for i in range(0,20):
        print(i)
        time.sleep(5)

background(display)


s = socket.socket()
s.bind((ip,6500))
s.listen(5)
print("listening")

val,addr = s.accept()
cmd = val.recv(1024)
if cmd == "Terminate Process":
    print("Connected")
    thread.close()
    print("Process Closed")
Run Code Online (Sandbox Code Playgroud)

错误:

AttributeError: 'Thread' object has no attribute 'close'
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 5

简短的回答:

thread.join()
Run Code Online (Sandbox Code Playgroud)

经验法则是:不要杀死线程(请注意,在某些环境中,这甚至可能是不可能的,例如标准 C++11 线程)。让线程获取信息并终止自身。从其他线程控制线程会导致难以维护和调试代码。

例如

SHOULD_TERMINATE = False

def display():
    for i in range(0,20):
        print(i)
        time.sleep(5)
        if SHOULD_TERMINATE:
            return

thread = Thread(target=display)
thread.start()

// some other code
if cmd == "Terminate Process":
    SHOULD_TERMINATE = True
    thread.join()
Run Code Online (Sandbox Code Playgroud)

这当然被大大简化了。可以使用事件对象(而不是.sleep)或线程池进一步细化您的代码。