python 单进程、单线程实现多任务的一种方法,以创建tcp服务为例
# -*- coding: utf-8 -*-
import socket
import time
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置端口可以重复使用
tcp_server.bind(("",7890))
tcp_server.listen(128)
tcp_server.setblocking(False) # 设置套接字为非堵塞的方式
client_socket_list = list() # 创建一个列表,目的是将已将连接的客户端加入到列表中
while True:
#time.sleep(2)
try:
new_socket, new_addr = tcp_server.accept()
except Exception as ret:
print("----1.没有新的客户端到来:{}----".format(ret))
else:
print("----2.只要没有产生异常,那么也就意味着来了一个新的客户端----")
new_socket.setblocking(False) # 设置套接字为非堵塞的方式
client_socket_list.append(new_socket) # 将连接的客户端加入列表中
for client_socket in client_socket_list: # 循环已连接的客户端,查看是否有数据发过来
try:
recv_data = client_socket.recv(1024)
except Exception as ret:
print("----3.这个客户端没有发送数据过来:{}----".format(ret))
else:
print("----4.没有异常,接收到数据为:{}----".format(recv_data))
if recv_data:
# 若recv_data不为空,说明对方发过来数据
print("----5.客户端发过来了数据----")
else:
# 对方调用close 导致了recv返回空
client_socket.close()
client_socket_list.remove(client_socket) # 将断开连接的客户端从列表中删除
print("----6.客户端已经关闭----")
运行结果: