有bug,请在评论区留下你得真言,谢谢
concurrent.futures 包含线程池和进程池,目前只记录线程池 ThreadPoolExecutor的使用
小二,上代码~
from concurrent.futures import ThreadPoolExecutor
import threading
import time
def test(i):
print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
time.sleep(1)
return 'finished'
if __name__ == "__main__":
pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
list_t = []
for i in range(10):
future = pool.submit(test, i)
list_t.append(future)
pool.shutdown(wait=True)
1.创建线程池ThreadPoolExecutor,max_workers:线程池的最大容量;thread_name_prefix:线程名称前缀,打印线程名称可查看
2.创建10个任务,给线程池执行,最大容量设置为4,所以只会同时执行4个任务
submit,执行任务,第一个参数test指定执行任务的函数,第二个参数指定给函数的参数
执行任务的函数,return,用于查看任务的执行结果
3.经过测试,当首次创建线程池时,是没有线程生成的,而是每提交一个任务给线程池,则会生成一个线程
生成的线程数=min(线程池容量(4),期望的任务数range(10))
线程池的线程执行完任务,不会被杀死,而是空闲状态,等待下个任务进来
4.pool.shutdown(),关闭线程池,结束线程,如果是想等所有任务完成,再关闭线程池,则设置pool.shutdown(wait=True)
from concurrent.futures import ThreadPoolExecutor
import threading
import time
def test(i):
print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
time.sleep(1)
return 'finished'
if __name__ == "__main__":
pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
list_t = []
for i in range(10):
future = pool.submit(test, i)
list_t.append(future)
print(future.done())
pool.shutdown(wait=True)
5.查看任务是否完成,future.done(),返回值是bool
from concurrent.futures import ThreadPoolExecutor
import threading
import time
def test(i):
print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
time.sleep(1)
return 'finished'
def done_callback(future):
print(future.result())
print('it is stop %s' % threading.current_thread().name)
if __name__ == "__main__":
pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
list_t = []
for i in range(10):
future = pool.submit(test, i)
list_t.append(future)
# time.sleep(1.5)
future.add_done_callback(done_callback)
for t in list_t:
print(t.result())
print(threading.active_count())
pool.shutdown(wait=True)
print(threading.active_count())
异步回调,输出任务执行结果,future.add_done_callback(done_callback),done_callback()为回调函数,即任务执行完或者
退出就调用这个函数
注意:回调函数必须存在一个参数,代表调用函数的任务对象future,可以通过这个对象查看执行结果,future.result()
大家可能注意到,我这里注释了一行代码,sleep(),有这样两种情况:
1) 存在这行代码,执行回调函数,打印线程,是主线程
2) 不存在这行代码,执行回调函数,打印线程,是当前执行任务的线程
3) 总结:有个猜测,回调方法,是线程执行完任务就调用这个方法,如果sleep()阻塞,则这个future脱离了这个线程,只是一个对象,对于这个调用,变成了主线程执行,
大家有知道的评论区留下,谢谢
同步输入任务执行结果,通过列表存储这些任务,调用result()获取执行结果
threading.active_count():查询当前线程数:生成的线程数=min(线程池容量(4),期望的任务数range(10)) + 1(1代表主线程),关闭线程池后,数量为1,只剩下主线程,代表关闭线程池,则实现线程被杀死