有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,只剩下主线程,代表关闭线程池,则实现线程被杀死