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信息等,这些信息,应该留一个后门接口,在程序启动后使用命令进行状态查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值