9.11 进程池与线程池
池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务
池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于IO密集型
进程池:
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time,os,random def task(x): print('%s 接客' %os.getpid()) time.sleep(random.randint(2,5)) return x**2 if __name__ == '__main__': # ProcessPoolExecutor创建并开启指定数目的进程 p=ProcessPoolExecutor() # 默认开启的进程数是cpu的核数 for i in range(20): p.submit(task,i) # 一下并行执行四个任务,等其中一个任务执行完后再执行下一个
线程池:
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time,os,random def task(x): print('%s 接客' %x) time.sleep(random.randint(2,5)) return x**2 if __name__ == '__main__': # ThreadPoolExecutor创建并开启指定数目的线程 p=ThreadPoolExecutor(4) # 默认开启的线程数是cpu的核数*5 for i in range(20): p.submit(task,i) # 一下并发执行四个任务,等其中一个任务执行完后再并发执行下一个
9.112 基于多线程实现并发的套接字通信(使用线程池)
服务端:
from socket import * from threading import Thread from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor tpool=ThreadPoolExecutor(3) #ThreadPoolExecutor创建并开启指定数目的线程 def communicate(conn,client_addr): while True: # 通讯循环 try: data = conn.recv(1024) if not data: break conn.send(data.upper()) except ConnectionResetError: break conn.close() def server(): server=socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) while True: # 链接循环 conn,client_addr=server.accept() print(client_addr) # t=Thread(target=communicate,args=(conn,client_addr)) # t.start() tpool.submit(communicate,conn,client_addr)#一下并发执行3个任务,等其中一个任务执行完后再并发执行下一个 server.close() if __name__ == '__main__': server()