python3 进程池 线程池

450 阅读1分钟

线程池和进程池

由于频繁的创建线程和进程比较消耗资源,因此可以他通过提前创建多个线程或者多个进程,然后复用这些线程和进程,从而提升程序执行效率。

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

import time

#
pool = ThreadPoolExecutor()  # 如果不传递,则为CPU核心数+4,最大为32


def task(name):
    print(f"{name} hello world")
    time.sleep(4)
    return name * name


all_task = []
for i in range(30):
    future = pool.submit(task, i)
    # print(future.result())  # 会等待线程执行结束
    all_task.append(future)

pool.shutdown()  # 等待所有的任务执行完毕

# 所有的返回结果都是有序的。
for p in all_task:
    print(p.result())

进程池

import os
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

import time

#
pool = ProcessPoolExecutor()  # 如果不传递,则为CPU核心数+4,最大为32


def task(name):
    print(f"{name} hello world")
    time.sleep(4)
    print("pid: ", os.getpid())
    return name * name


all_task = []

if __name__ == '__main__':

    for i in range(30):
        future = pool.submit(task, i)
        # print(future.result())  # 会等待线程执行结束
        all_task.append(future)

    pool.shutdown()  # 等待所有的任务执行完毕

    # 所有的返回结果都是有序的。
    for p in all_task:
        print(p.result())

任务回调

import os
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

import time

#
pool = ProcessPoolExecutor()  # 如果不传递,则为CPU核心数+4,最大为32


def task(name):
    print(f"{name} hello world")
    time.sleep(4)
    print("pid: ", os.getpid())
    return name * name


all_task = []


def callback(n):
    print("callback ", n)


if __name__ == '__main__':

    for i in range(30):
        future = pool.submit(task, i).add_done_callback(callback)
        # print(future.result())  # 会等待线程执行结束
        all_task.append(future)

    pool.shutdown()  # 等待所有的任务执行完毕

    # 所有的返回结果都是有序的。
    for p in all_task:
        print(p.result())