我正在尝试在客户端中创建一个单独的线程,以非阻塞方式恢复来自服务器套接字的消息。由于我的原始代码太长并且为了理解它而解释起来有点麻烦,我创建了一个示例程序,它专注于我想做的事情。我尝试创建两个单独的线程,比如 Thread t1 和 Thread t2。 Thread t1 轮询套接字以检查是否有任何接收到的数据,而 Thread t2 执行分配给它的任何任务。我期望它做的是,Thread t1 总是进行轮询,如果收到数据,它会将其打印在屏幕上,并且 Thread t2 并行执行它正在做的事情.但是,由于某种原因我无法让它工作。
我的示例程序是:
import threading
import time
import threading
from time import sleep
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 5555))
s.setblocking(0)
s.sendall(str.encode('Initial Hello'))
def this_thing():
while True:
try:
data = s.recv(4096)
print(data.decode('utf-8'))
except:
pass / break #not sure which one to use. Neither of it works
def that_thing():
for i in range(10000):
sleep(3)
s.sendall(str.encode('Hello')
print('happening2')
threading.Thread(target=this_thing(), args=[]).start()
threading.Thread(target=that_thing(), args=[]).start()
注意: 服务器套接字是一个简单的服务器,如果收到消息,它会向所有连接的套接字发送消息。 当我在 Thread t1 中通过 breaking in the exception 运行程序时,只有我的 Thread t2 保持运行。 即 线程 t1 没有收到服务器发送的任何数据
请您参考如下方法:
发生这种情况的原因是因为“目标”参数采用可调用对象。
来自文档 docs.python.org/2/library/threading.html
"target是run()方法要调用的可调用对象"
在你的版本中
threading.Thread(target=this_thing(), args=[]).start()
threading.Thread(target=that_thing(), args=[]).start()
当您说 target=this_thing() 时,它会尝试评估对 this_thing 的调用的值,在您的情况下,它将进入一个 while True 循环,然后如果它要完成,它将评估为 None。
你想要做的是将这两行替换为
threading.Thread(target=this_thing, args=[]).start()
threading.Thread(target=that_thing, args=[]).start()
请注意,您现在传递的是函数本身。函数是一个可调用对象。
