Python _thread没有执行?

时间:2015-01-28 17:43:55

标签: python-3.x

我正在尝试创建一个与我的服务器交互的聊天客户端。为了做到这一点,我使用_thread模块中的一个线程允许发送和接收同时运行。但是,当我启动该程序时,我什么都没得到。没有允许收到的消息,也没有提示发送任何消息。怎么了?

代码:

import socket
from _thread import *


host = 'localhost'
port = 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host,port))






'''while True:
    sock.send(input('REPLY: ').encode('utf-8'))
    print(str(sock.recv(1000)))



'''
x = None






def sendMess(x):
    print('sendMess started')
    while True:
        x = input("SEND: ")
        sock.send(x.encode("utf-8"))
    return





def recvMess(x):
    print('recvMess started.')
    while True:
        data = sock.recv(4000)
        print(str(data))
    return                

if sock:

    start_new_thread(sendMess, (x,))

    start_new_thread(recvMess, (x,))

1 个答案:

答案 0 :(得分:2)

首先,您不应再使用_thread模块,请使用更高级别的threading模块。

您的示例中的问题是,在启动线程后,主线程退出。

_thread文档警告您:

  

<强>注意事项

     

[...]

     
      
  • 当主线程退出时,系统定义其他线程是否存活。在大多数系统上,它们在没有执行try ... finally子句或执行对象析构函数的情况下被杀死。
  •   

这意味着你的线程在真正做任何工作之前就被销毁了。 threading.Thread个对象在这里表现不同,除非设置了daemon标记,否则它们不会被销毁。

要使其正常工作,只需更改您的代码:

import socket
from threading import Thread

...

if sock:
    Thread(target=sendMess, args=(x,)).start()
    Thread(target=recvMess, args=(x,)).start()