Python中如何使用线程池和进程池?

进程池的使用

为什么要有进程池?进程池的概念。

在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。

那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。

第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。

因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?

在这里,要给大家介绍一个进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,

等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,

拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

 

from multiprocessing import Pool
from multiprocessing import Process
import time
import os

def func(n):

    print("子进程开始: %s"%n, os.getpid())

    time.sleep(1)

    print("子进程结束: %s" % n, os.getpid())


if __name__ == "__main__":

    # 开启了5个进程
    pool = Pool(5)

    for i in range(10):

        # 正常情况下先执行5个start 后执行5个end
        p = Process(target=func,args=(i,))
        p.start()

线程池的使用

import time
from concurrent.futures import ThreadPoolExecutor


def func(n):
    print(n)
    time.sleep(1)
    return n * 10


t_lst = []

# 定义一个线程池(默认 不要超过cup个数*5)
tpool = ThreadPoolExecutor(max_workers=5)

for i in range(20):

    # 传值(开启20个子线程)
    t = tpool.submit(func, i)
    t_lst.append(t)

# 相当于 close + join
tpool.shutdown()

print("主线程")

for t in t_lst:
    # t.result() 接受返回值
    print("\033[31m ==== \033[0m", t.result())
posted @ 2019-12-17 09:34  Mr_Riven  阅读(751)  评论(0编辑  收藏  举报