Python如何从入门到精通,深入理解线程池的使用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计481个文字,预计阅读时间需要2分钟。
一、ThreadPoolExecutor 1.1、基本实现pythonfrom 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}')
一、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, 'www.python.org')
b = pool.submit(fetch_url, '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)
本文共计481个文字,预计阅读时间需要2分钟。
一、ThreadPoolExecutor 1.1、基本实现pythonfrom 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}')
一、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, 'www.python.org')
b = pool.submit(fetch_url, '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)

