python的进程池,线程池(使用futures库实现)


import time
from concurrent import futures


def func_test(data):
    print("这里是子线程函数")
    time.sleep(1)
    return data


def call_back_func(future_obj, var=None):
    print(future_obj.result())
    print("每个子线程执行完成后,会执行该回调函数, 打印var={}".format(var))


if __name__ == '__main__':
    data_list = ["a", "b", "c"]
    thread_num = min(50, len(data_list))

    """方法一: 使用map函数"""
    with futures.ThreadPoolExecutor(thread_num) as executor:  # 开启线程池
        res_data = executor.map(func_test, data_list, timeout=0.5)  # 开启线程(等待所有的子线程任务执行结束,代码才会继续往下执行)

    # 如果需要res_data,也就是子线程返回得内容, 则for循环取出所有子线程得返回得值
    for i in res_data:
        print(i)

    """方法二: 使用submit"""
    with futures.ThreadPoolExecutor(thread_num) as executor:
        res_list = []
        for i in range(2):
            future_obj = executor.submit(func_test, 111)

            # 线程执行结束后或终止后会执行该回调函数, 自动将future_obj当作函数的第一个参数传给函数
            future_obj.add_done_callback(call_back_func)

            res_list.append(future_obj)  # 将结果对象添加到列表中

        for res in res_list:
            print(res.result())  # 使用result可以获取函数执行的return结果

    """方法三: 使用wait和submit函数"""
    "wait返回值是一个元组,元组里是已完成和未完成的两个集合," \
    "它的return_when参数接受3个选项:" \
    "ALL_COMPLETED: 意味着所有都完成," \
    "FIRST_COMPLETED: 意味着有一个完成了就可以了, " \
    "FIRST_EXCEPTION: 是第一个出现异常就会停止wait"

    from concurrent.futures import wait

    with futures.ThreadPoolExecutor(thread_num) as executor:
        res_list = []
        for i in range(3):
            future_obj = executor.submit(func_test, i)
            res_list.append(future_obj)

    wait(res_list, return_when='FIRST_EXCEPTION')

    print("这里是主线程")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值