Python中port()函数的多线程与异步IO编程实践
发布时间:2023-12-27 00:26:44
在Python中,可以使用socket模块中的socket类以及select模块中的select函数实现多线程与异步IO编程。以下是一个使用示例,演示如何创建一个服务器,同时处理多个客户端连接。
import socket
import select
import threading
# 定义服务器的地址和端口号
HOST = 'localhost'
PORT = 12345
# 创建服务器的socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
# 监听连接
server_socket.listen(5)
print('Server started on {}:{}'.format(HOST, PORT))
# 定义用于存储客户端socket的列表
client_sockets = [server_socket]
# 定义锁
lock = threading.Lock()
# 定义处理客户端连接的函数
def handle_client(client_socket):
while True:
# 使用select函数实现异步IO,等待读取和写入的socket对象
readable, writable, _ = select.select([client_socket], [client_socket], [])
# 读取数据
for sock in readable:
data = sock.recv(1024)
if not data:
print('Client {} disconnected'.format(client_socket.getpeername()))
lock.acquire()
client_sockets.remove(client_socket)
lock.release()
client_socket.close()
return
print('Received message from {}: {}'.format(client_socket.getpeername(), data.decode()))
# 发送响应
for sock in writable:
message = 'Hello from server!'
sock.sendall(message.encode())
# 定义主线程用于接受客户端连接
def main_thread():
while True:
# 使用select函数实现异步IO,等待接受连接的socket对象
readable, _, _ = select.select(client_sockets, [], [])
# 处理新的连接
for sock in readable:
if sock == server_socket:
client_socket, address = server_socket.accept()
print('Accepted connection from {}:{}'.format(address[0], address[1]))
lock.acquire()
client_sockets.append(client_socket)
lock.release()
threading.Thread(target=handle_client, args=(client_socket,)).start()
# 启动主线程
threading.Thread(target=main_thread).start()
这是一个简单的多线程服务器,它通过启动一个主线程来接受客户端连接。每当有新的连接到达时,将创建一个新的线程来处理该连接。处理连接的函数中使用了select函数来实现异步IO,以便同时处理多个客户端的读写请求。
这个例子中只展示了如何建立连接和收发数据,实际应用中可能还需要处理更多的情况,比如处理连接错误、关闭连接等。但基本原理是一样的,使用socket模块和select模块的函数可以很方便地实现多线程与异步IO编程。
