【问题标题】:How to terminate a running Thread in python?如何在python中终止正在运行的线程?
【发布时间】:2018-08-12 21:01:30
【问题描述】:

我在这段代码中使用套接字与其他机器连接。当我从其他机器收到消息时我想终止线程但是如何在 Python 中终止线程? 我参考了许多 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")

错误:

AttributeError: 'Thread' object has no attribute 'close'

【问题讨论】:

  • 你用的是哪个版本的python?
  • python 2.7.....

标签: python multithreading python-2.7 sockets


【解决方案1】:

简答:

thread.join()

经验法则是:不要杀死线程(请注意,在某些环境中这甚至可能是不可能的,例如标准 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()

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

【讨论】:

  • 感谢您的解决方案,但我正在使用线程和子进程在 cmd 中的实际代码上运行一些大进程,所以这在那里不起作用。
  • @sachindubey 我没有看到“大流程”和“它不起作用”之间的关系。你是说不能修改底层线程代码?
  • @sachindubey 不管你喜不喜欢,这就是必须要做的事情。最终,您必须与需要终止的线程(通过全局或Event)进行通信并让它自行终止。
  • 我有一个命令,我需要使用子进程在 cmd 上运行,所以我使用线程运行该子进程,然后我正在使用套接字监听客户端 ....如果客户端告诉我停止然后我需要停止那个子进程..
  • 谢谢@donkopotamus ya 也许活动可以成为一个解决方案
最近更新 更多