python3 进程池Pool

进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果

进程池无IO堵塞的情况

 

# -*- coding: utf-8 -*-
import os
from multiprocessing import Pool


def func(n):
    return n**2


if __name__ == '__main__':
    pool = Pool()
    obj_lst = []
    for i in range(6):
        p_obj = pool.apply_async(func, args=(i,))  # 异步执行进程
        obj_lst.append(p_obj)
    pool.close()  # 不再向进程池提交新的任务了
    pool.join()  # 进程池中的进程都执行完了
    print([p_obj.get() for p_obj in obj_lst])


# [0, 1, 4, 9, 16, 25]

 

 

 

 

# coding:utf-8
import time
from multiprocessing import Process, Pool


def func(n):
    pass


if __name__ == '__main__':
    num = 10
    start_pool_time = time.time()
    pool = Pool(5)
    pool.map(func, range(num))  # map是异步执行的,并且自带close和join
    print("通过进程池执行的时间:", time.time() - start_pool_time)

    std_start_time = time.time()
    for i in range(num):
        pass
    print("正常执行的执行时间:", time.time() - std_start_time)

    pro_start_time = time.time()
    p_lst = []
    for i in range(num):
        p = Process(target=func, args=(i,))
        p.start()
        p_lst.append(p)

    [pp.join() for pp in p_lst]
    print("多进程的执行时间:", time.time() - pro_start_time)

# 通过进程池执行的时间: 0.46875
# 正常执行的执行时间: 0.0
# 多进程的执行时间: 0.828125

#一般约定俗成的是进程池中的进程数量为CPU的数量,工作中要看具体情况来考量。

 

有IO阻塞的情况

# coding:utf-8
import time
from multiprocessing import Process, Pool


def func(n):
    time.sleep(1)


if __name__ == '__main__':
    num = 10
    start_pool_time = time.time()
    pool = Pool(5)
    pool.map(func, range(num))
    print("通过进程池执行的时间:", time.time() - start_pool_time)

    std_start_time = time.time()
    for i in range(num):
        time.sleep(1)
    print("正常执行的执行时间:", time.time() - std_start_time)

    pro_start_time = time.time()
    p_lst = []
    for i in range(num):
        p = Process(target=func, args=(i,))
        p.start()
        p_lst.append(p)

    [pp.join() for pp in p_lst]
    print("多进程的执行时间:", time.time() - pro_start_time)


# 通过进程池执行的时间: 2.578125
# 正常执行的执行时间: 10.0
# 多进程的执行时间: 1.75

 

转载于:https://www.cnblogs.com/lilyxiaoyy/p/10986358.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值