day53-线程池

#1、from concurrent import futures可以开启进程池和线程池。concurrent是包,futures是模块,ThreadPoolExecutor是类,submit是方法。
#submit创建和开启子线程:
from concurrent import futures
import time
import random

def func(n):
    print(n)
    time.sleep(random.randint(1,3))#看效果:一开始先执行5个线程,后来谁先执行完就结束,轮到下一个线程执行。

p = futures.ThreadPoolExecutor(5) #线程池里有5个线程。
for i in range(10):              #开启10个子线程。
    p.submit(func,'hello,world')  #submit合并了创建线程对象和start的功能。

#2、result获取返回值,shutdown封装了close和join:
#主线程传参给子线程处理数据,子线程把值返回给主线程。
from concurrent import futures
def func(n):
    print(n)
    return n + 1

thread_pool = futures.ThreadPoolExecutor(5)
t_lst = []
for i in range(10):
    t = thread_pool.submit(func,1) #submit提交任务
    t_lst.append(t)
thread_pool.shutdown() #shutdown封装了close()和join(),意思是线程池关闭继续放线程的功能,
                       # 主线程阻塞在这里,等待子线程全部结束之后才变成非阻塞,下面的代码才能继续执行。
                       #这样操作的结果就是,先打印出n最后才打印n+1。
for t in t_lst:
    print(t.result()) #获取返回值

#3、map创建和开启子线程,后面必须是可迭代的,不可以接收返回值,所以如果func有return返回值,是无法接收的。
from concurrent import futures
def func(i):
    print(i)

thread_pool = futures.ThreadPoolExecutor(5)
thread_pool.map(func,range(10))

#4、回调函数:add_done_callback(call)
#call的args接收func的返回值
from concurrent import futures
def func(i):
    return i*'*'

def call(args):
    print(args.result())

thread_pool = futures.ThreadPoolExecutor(5)
for i in range(10):
    t = thread_pool.submit(func,i)
    t.add_done_callback(call)

猜你喜欢

转载自www.cnblogs.com/python-daxiong/p/12142818.html
今日推荐