1.进程池线程池
1.1 基于多线程的socket
-
服务端
import socket from threading import Thread def task(conn, addr): while 1: try: from_client_data = conn.recv(1024) if from_client_data.upper() == b'Q': break print(f'来自{addr}客户的消息:{from_client_data.decode('utf-8')}') to_client_data = input('>>>') conn.send(to_client_data.encode('utf-8')) except Exception: break conn.close() def communication(): server = socket.socket() server.bind(('127.0.0.1', 8848)) server.listen(5) while 1: conn, addr = server.accept() t1 = Thread(target=task, args=(conn,addr)) t1.start() communication()
-
客户端
import socket client = socket.socket() client.connect(('127.0.0.1', 8848)) while 1: to_server_data = input('>>>') client.send(to_server_data.encode('utf-8')) if to_server_data.upper() == 'Q': break from_server_data = client.recv(1024) print(f'来自服务端的消息:{from_server_data.decode('utf-8')}')
此版本有问题,来多少链接就需要创建多少线程,显然不合理,我们应该控制线程上限。
1.2 线程池
存放线程的容器,线程的数量是固定的。
from concurrent.futures import ThreadPoolExecutor
import time
import threading
import random
import os
def task(n):
print(f'{threading.currentThread()}开始任务')
time.sleep(random.randint(1, 3))
print(f'{threading.currentThread()}结束任务')
if __name__ == '__main__':
thread_pool = ThreadPoolExecutor(max_workers=5)