#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)
day53-线程池
猜你喜欢
转载自www.cnblogs.com/python-daxiong/p/12142818.html
今日推荐
周排行