美文网首页
并发编程-线程池

并发编程-线程池

作者: Yanl__ | 来源:发表于2019-10-28 20:31 被阅读0次

线程池通过concurrent.futures包中导入ThreadPoolExecutor(也可以导入进程池,ProcessPoolExecutor。 基本方法用法与线程一致)
-基本方法:

  1. 起线程池t_pool = ThreadPoolExecutor(max_workers=5).其中max_workers的值为多线程的数量,一般不超过cpu数*5
  2. 提交任务t_pool.submit(func, args).其中func为需要执行的函数,args为需要传给func的参数
  3. 等待所有线程执行完毕后再执行后续的主进程代码t_pool.shutdown()
  4. 回调函数t.add_done_callback(call_back). t为submit后得到的返回值,在通过add_done_callback调用回调函数,将每个值传给回调函数call_back
  5. map(func, iterator). 功能与submit类似,只是不能获得函数的返回值。其中func为需要执行的函数,iterator为可迭代的对象,将值传给func
# -*- coding: UTF-8 -*-

"""
# @Author  : yanlei
# @FileName: 线程池

从concurrent.futures中导入线程池。(也可以导入进程池,用法一样)
"""
from concurrent.futures import ThreadPoolExecutor
import time

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


def call_back(ret):
    print('结果是%s'%ret.result())


# t_list = []
# t_pool = ThreadPoolExecutor(max_workers=5)  # 设置线程池中线程的个数,不要超过cpu数*5
# for i in range(20):
#     t = t_pool.submit(func, i)  # 提交任务,submit可以取得返回值。 map不能获取返回值
#     t_list.append(t)
# t_pool.shutdown()  # shutdown 功能等于 t_pool.close() + t_pool.join()
# for t in t_list:  # 如果上面没有执行shutdown(),则一次执行5个线程后就输出5个结果
#     print('t的值', t.result())  # t.result() 从t对象中获取具体的值
#

# map
# t_pool = ThreadPoolExecutor(max_workers=5)
# t_pool.map(func, range(20))  # map拿不到func的返回值


# add_done_callback  回调函数
# 用法一:
t_list = []
t_pool = ThreadPoolExecutor(max_workers=5)  # 设置线程池中线程的个数,不要超过cpu数*5
for i in range(20):
    t_pool.submit(func, i).add_done_callback(call_back)


# 用法二:
t_list = []
t_pool = ThreadPoolExecutor(max_workers=5)  # 设置线程池中线程的个数,不要超过cpu数*5
for i in range(20):
    t = t_pool.submit(func, i)
    t_list.append(t)
t_pool.shutdown()
for t in t_list:
    t.add_done_callback(call_back)

相关文章

网友评论

      本文标题:并发编程-线程池

      本文链接:https://www.haomeiwen.com/subject/axhivctx.html