Skip to main content
 首页 » 编程设计

python之如何在 Python 中实现多线程 [套接字编程]

2024年08月20日32findumars

我正在尝试在客户端中创建一个单独的线程,以非阻塞方式恢复来自服务器套接字的消息。由于我的原始代码太长并且为了理解它而解释起来有点麻烦,我创建了一个示例程序,它专注于我想做的事情。我尝试创建两个单独的线程,比如 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() 

请注意,您现在传递的是函数本身。函数是一个可调用对象。