欢迎访问宙启技术站
智能推送

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编程。