python中socket智能调结用户连接数
前边有解决过socket多客户端连接,但是会有一个问题就是无法自然增长,使用的是for循环,增长到一定数量后就无法继续增长,会带来问题,所以针对这个问题重新进行了解决方案输出:
服务端代码如下:
import socket
import sys
import threading
# from concurrent.futures import ThreadPoolExecutor
# threads = ThreadPoolExecutor(max_workers=10)
# threads = thread.ThreadPoolExecutor(max_workers=10)
conn_list = []
thread_stat = 0
ip = socket.gethostbyname(socket.gethostname())
port = 9876
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind((ip,port))
server_socket.listen(10)
print(socket.getaddrinfo(ip,port))
print(socket.gethostbyaddr(ip))
def get_conn():
recv_socket, addr = server_socket.accept()
conn_list.append(addr)
global thread_stat
thread_stat = 1
print('当前线程数量为:%d'%threading.active_count())
while True:
recv_str = recv_socket.recv(1024).decode()
print(conn_list)
if recv_str == "" or recv_str == 'exit':
# server_socket.close()
recv_socket.close()
sys.exit(0)
else:
print(recv_str)
if __name__ == '__main__':
s = 0
while (s < 1024 and thread_stat == 0):
print('s=%d,thread_stat = %d'%(s,thread_stat))
if s < 4:
s += 1
t = threading.Thread(target=get_conn)
t.start()
s += 1
elif thread_stat == 1:
s += 1
t = threading.Thread(target=get_conn)
t.start()
thread_stat = 0
解决方案说明:
采用while循环,不停的轮询,并设置状态量,轮询查看状态量,如果状态量发生变化,就创建一个新的线程,否则现有状态不变。
这个目前还不完善的地方在于,一个进程目前会根据内存大小资源情况来决定所能开通的线程数量,也还是有限的,无法在一个线程达到最大后,再开一个进程并创建线程,所以这个是还需要继续解决的。
当前的谷歌浏览器就是这样的,每创建一个新的窗口,就是会打开一个新的线程,都是单个线程对应一个窗口。这样可以有效的利用现有硬件资源。
在这里其实还有一些信息需要输出,比如当前连接数量,连接状态,启动的进程数量,连接客户端的Ip信息等,这些信息,应该留一个后门接口,在程序启动后使用命令进行状态查看。