python 非阻塞模式 线程池

meylovezn 2020-05-30

"""
非阻塞模式:当进程池有空闲,就将任务放入,它会继续执行主进程
"""
import os
import time
from multiprocessing import Pool
from random import random

container = []


def task(name):
    print("进行任务{}  进程ID:{}".format(name, os.getpid()))
    start = time.time()
    # random() 的值是0到1之间,这里就表示休眠 0到2秒
    time.sleep(random() * 2)
    end = time.time()
    return "完成任务:{}  用时:{}  进程ID:{}".format(name, (end - start), os.getpid())


def callback_func(n):
    """将进程返回的内容n,放进这个函数内运行"""
    container.append(n)  # 添加返回内容到container,这里也可以对返回的函数进行其它的处理


if __name__ == ‘__main__‘:
    pool = Pool(5)  # 创建一个进程池,里面放5个进程
    tasks = ["任务1", "任务2", "任务3", "任务4", "任务5", "任务6", "任务7"]
    for t in tasks:
        # apply_async 非阻塞模式,只要存在没有使用的进程,就将任务放进去
        pool.apply_async(task, args=(t,), callback=callback_func)

    pool.close()
    pool.join()  # 将进程池插入到这里,只要当它里面的任务全部都执行完,才继续

    for c in container:
        print(c)

    print("over")

相关推荐