当前位置 : 主页 > 编程语言 > python >

Python从门到精通(六):线程-02-线程池

来源:互联网 收集:自由互联 发布时间:2022-06-27
一、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, socket
from 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 ThreadPoolExecutor
import 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 Thread
from 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_STREAM
from 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)


上一篇:Python从门到精通(六):线程-03-线程间通信
下一篇:没有了
网友评论