一、ThreadPoolExecutor 1.1、基本实现 from socket import AF_INET , SOCK_STREAM , socket from concurrent . futures import ThreadPoolExecutor def echo_client ( sock , client_addr ): ''' Handle a client connection ''' print ( f'Got conne
一、ThreadPoolExecutor
1.1、基本实现
from socket import AF_INET, SOCK_STREAM, socketfrom concurrent.futures import ThreadPoolExecutor
def echo_client(sock, client_addr):
'''
Handle a client connection
'''
print(f'Got connection from {client_addr}')
while True:
msg = sock.recv(65536)
if not msg:
break
sock.sendall(msg)
print('Client closed connection')
sock.close()
def echo_server(addr):
pool = ThreadPoolExecutor(128)
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(addr)
sock.listen(5)
while True:
client_sock, client_addr = sock.accept()
pool.submit(echo_client, client_sock, client_addr)
echo_server(('',15000))
1.2、带返回值的线程
from concurrent.futures import ThreadPoolExecutorimport requests
def fetch_url(url):
u = requests.get(url)
data = u.text
return data
pool = ThreadPoolExecutor(10)
a = pool.submit(fetch_url, 'http://www.python.org')
b = pool.submit(fetch_url, 'http://www.pypy.org')
x = a.result()
y = b.result()
print(x)
1.3、有限线程池
from threading import Threadfrom socket import socket, AF_INET, SOCK_STREAM
def echo_client(sock, client_addr):
'''
Handle a client connection
'''
print(f'Got connection from {client_addr}')
while True:
# msg = sock.recv(65536)
if not (msg := sock.recv(65536)):
break
sock.sendall(msg)
print('Client closed connection')
sock.close()
def echo_server(addr):
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(addr)
sock.listen(5)
while True:
client_sock, client_addr = sock.accept()
t = Thread(target=echo_client, args=(client_sock, client_addr))
t.daemon = True
t.start()
echo_server(('',15000))
1.4、手动创建线程池
from socket import socket, AF_INET, SOCK_STREAMfrom threading import Thread
from queue import Queue
def echo_client(q):
'''
Handle a client connection
'''
sock, client_addr = q.get()
print(f'Got connection from {client_addr}')
while True:
# msg = sock.recv(65536)
if not (msg := sock.recv(65536)):
break
sock.sendall(msg)
print('Client closed connection')
sock.close()
def echo_server(addr, nworkers):
q = Queue()
for n in range(nworkers):
t = Thread(target=echo_client, args=(q,))
t.daemon = True
t.start()
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)