在Python的单独线程中杀死tcp连接

时间:2013-11-18 00:33:23

标签: python multithreading tcp python-multithreading

所以这就是问题,我在Python中有一个小的服务器脚本,它应该接受多个客户端,并根据他们发送的消息,接收一个特定的命令。这是一个简单的概念,它的工作方式与我想要的一样,有一个非常大的问题:我将每个连接置于保持状态并处于单独的线程中,我希望当某个连接用户放置EXIT以关闭连接时......这有效,一个非常大的问题 - 线程保持活着,没有办法杀死它,这真的困扰我。

sock = socket()
sock.bind((host,port))
sock.listen(50)

def clientthread(conn):
    while True:
        data = conn.recv(1024).strip()
        if(data == "HELO"):
            conn.send("HELO")
        elif(data == "EXIT"):
            conn.close()
            break
    return

while True:

    conn,addr = sock.accept()
    start_new_thread(clientthread, (conn,))

conn.close()
sock.close()

我搜索了一种终止线程的方法,但是找不到它,.join()在这里工作不正常,因为它将线程检测为“虚拟”,它不识别__stop()并且因为一对谷歌搜索这个主题我真的没有选择。任何的想法?我真的很感激,谢谢。

2 个答案:

答案 0 :(得分:0)

AFAIK,你不能从另一个线程中杀死一个线程 - 你必须安排线程被杀死以注意到一些标志已经改变,并自行终止。

顺便说一下,你的套接字代码看起来有些偏差 - 除非你使用像twisted或bufsock这样的东西,否则你需要在你的发送和recv周围循环。 IMO,bufsock比扭曲更容易,更容易出错,但我可能有偏见因为我写了bufsock。 http://stromberg.dnsalias.org/~strombrg/bufsock.html

我所看到的问题是TCP保留拆分或汇总传输单元的权利。通常它不会,但在高负荷下,或者路径MTU变化,甚至只是Nagle,它可能会。

答案 1 :(得分:0)

假设您使用的是Python v2.4 +,您应该使用较新的Threading模块。 Check out a tutorial on it here - 它解释了您现在使用的线程模块的使用以及您应该如何以及为何使用更新的线程模块。