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**2if __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**2if __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()
View Code

相关文章: