进程池
就是一个装进程的池子
为什么出现进程池
当进程很多时候方便管理进程
什么时候用
当并发量特别大的时候,列入双十一
很多时候进程是空闲的,就让他进入进程池,让有任务处理时才从进程池取出来使用。
进程池的使用
ProcessPoolExecutor类
创建时指定最大进程数 自动创建进程
调用submit函数将任务提交到进程池中
创建进程是在调用submit后发生的
总结
进程池可以自动创建进程
进程限制最大进程数
自动选择一个空闲的进程帮你处理任务
from concurrent.futures import ProcessPoolExecutor #导入进程池 import socket def task(client): while True: try: data = client.recv(1024) print(data.decode("utf-8")) if not data: client.close() break client.send(data.upper()) except Exception: print("客户端断开") client.close() break if __name__ == '__main__': server = socket.socket() server.bind(("127.0.0.1",3555)) server.listen(5) #创建进程池默认个数为cpu的核心数 pool = ProcessPoolExecutor() while True: client,addr = server.accept() pool.submit(task,client)
客户端
import socket client = socket.socket() client.connect(("127.0.0.1",3555)) while True: msg = input(">>>") client.send(msg.encode("utf-8")) data = client.recv(1024) print(data.decode("utf-8"))
线程池使用方法基本相同(线程数限制为当前cpu核心数的5倍 20线程)
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor #导入进程池 import socket def task(client): while True: try: data = client.recv(1024) print(data.decode("utf-8")) if not data: client.close() break client.send(data.upper()) except Exception: print("客户端断开") client.close() break if __name__ == '__main__': server = socket.socket() server.bind(("127.0.0.1",3555)) server.listen(5) #创建进程池默认个数为cpu的核心数 # pool = ProcessPoolExecutor() #创建线程池默认个数为cpu核心的5倍 pool = ThreadPoolExecutor() while True: client,addr = server.accept() pool.submit(task,client)