问题描述
以下面这段代码为例子,我认为这段代码存在一个缺陷,作者通过下面这段代码限制了最多创建128个线程,但是这样的提前限制会导致一个问题。假设现在有129个客户端对服务器进行逐个分时请求,不是同时请求。作者这样提前限制了线程池中最多只能存在128个线程,但是每个线程处理完客户端连接后就会自动退出。
那么到第129个客户端请求的时候已经没有线程池中已经没有任何线程了,而且客户端都是采用的分时请求,虽然queue中还有任务。采用线程池的目的应该是限制同一时刻最多响应的连接数,这样不是和初衷相违背了吗?
实例代码
服务器等待客户端连接部分的代码
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
from queue import Queue
def echo_server(addr, nworkers):
# Launch the client workers
q = Queue()
for n in range(nworkers):
t = Thread(target=echo_client, args=(q,))
t.daemon = True
t.start()
# Run the server
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(addr)
sock.listen(5)
while True:
client_sock, client_addr = sock.accept()
q.put((client_sock, client_addr))
echo_server(('',15000), 128)
服务器处理客户端连接部分的代码
def echo_client(q):
'''
Handle a client connection
'''
sock, client_addr = q.get()
print('Got connection from', client_addr)
while True:
msg = sock.recv(65536)
if not msg:
break
sock.sendall(msg)
print('Client closed connection')
sock.close()
我觉得你的说法是对的。
Output:
说明线程确实是退出了。