进程池和线程池

进程池

就是一个装进程的池子

为什么出现进程池

当进程很多时候方便管理进程

什么时候用

当并发量特别大的时候,列入双十一

很多时候进程是空闲的,就让他进入进程池,让有任务处理时才从进程池取出来使用。

进程池的使用

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)
 
原文地址:https://www.cnblogs.com/msj513/p/9948148.html