线程池
Posted whylinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池相关的知识,希望对你有一定的参考价值。
# concurrent.futures模块提供了高度封装的异步调用接口。 # 其中ThreadPoolExecutor:线程池,提供异步调用 # 其中ProcessPooExecutor:进程池,提供异步调用。之前学过multiprocessing中的Pool也是进程池。 # 在这个concurrent.futures模块中,线程池与进程池的所有方法接口都是相同的 # 基本方法 # submit(fn, *args, **kwargs) 异步提交任务 # map(func, *iterable, timeout=None, chunksize = 1) 取代for循环submit操作 # shutdown(wait=True) 相当于进程池的pool.close() + pool.join()操作 # wait=True,等待池内所有任务执行完毕回收完资源后才继续 # wait=False,立即返回,并会等待池内的任务执行完毕 # 不管wait参数为何值,整个程序都会等到所有任务执行完毕 # submit和map必须在shutdown之前 # result(timeout=None) # 取得结果 # add_done_callback(fn) # 回调函数 # import time # from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 # # def func(n): # time.sleep(0.5) # print(n) # return n # # def my_call_back(n): # print(‘回调 ‘, n) # # if __name__ == ‘__main__‘: # tpool = ThreadPoolExecutor(max_workers=5) # 创建一个线程池,池子里存放5个线程,效率最好的话,这个参数还是为CPU数*5比较好些 # t_lst = [] # for i in range(20): # t = tpool.submit(func, i) # 异步提交任务到线程池中,让线程池开始调度,此时已经开始调度执行了.提交任务时,返回得到一个结果对象 # t_lst.append(t) # # tpool.shutdown() # 阻塞等待池子中所有的任务全部结束执行完。相当于进程池中的pool.close()和pool.join() # print(‘线程池中的任务执行结束‘) # for t in t_lst: # print(‘***‘, t.result()) # 通过提交任务到线程池中的方法返回得到的结果对象,从而获取到任务的返回值 # # 使用concurrent.futures模块中的进程池 # import time # from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 # from concurrent.futures import ProcessPoolExecutor # 导入进程池模块, 只需将创建线程那里改为创建进程即可 # # def func(n): # time.sleep(0.5) # print(n) # return n # # def my_call_back(n): # print(‘回调 ‘, n) # # if __name__ == ‘__main__‘: # tpool = ProcessPoolExecutor(max_workers=5) # 创建一个进程池 # t_lst = [] # for i in range(20): # t = tpool.submit(func, i) # 异步提交任务,提交任务时,返回得到一个结果对象 # t_lst.append(t) # # tpool.shutdown() # 阻塞等待池子中所有的任务全部结束执行完。相当于进程池中的pool.close()和pool.join() # print(‘线程池中的任务执行结束‘) # for t in t_lst: # print(‘***‘, t.result()) # 通过结果对象,从而获取到任务的返回值 # t.add_done_callback(my_call_back) # # 使用线程池中的map # import time # from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 # # def func(n): # time.sleep(0.5) # print(n) # return n # # def my_call_back(n): # print(‘回调 ‘, n) # # if __name__ == ‘__main__‘: # tpool = ThreadPoolExecutor(max_workers=5) # 创建一个线程池,池子里存放5个线程,效率最好的话,这个参数还是为CPU数*5比较好些 # tpool.map(func, range(20)) # 使用map,提交任务到线程池中,就拿不到任务的返回结果对象了 # # tpool.shutdown() # 阻塞等待池子中所有的任务全部结束执行完。相当于进程池中的pool.close()和pool.join() # print(‘线程池中的任务执行结束‘) # 使用结果对象的阻塞效果 # import time # from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 # # def func(n): # time.sleep(0.5) # print(n) # return n # # if __name__ == ‘__main__‘: # tpool = ThreadPoolExecutor(max_workers=5) # 创建一个线程池,池子里存放5个线程,效率最好的话,这个参数还是为CPU数*5比较好些 # t_lst = [] # for i in range(20): # t = tpool.submit(func, i) # 异步提交任务到线程池中,让线程池开始调度,此时已经开始调度执行了.提交任务时,返回得到一个结果对象 # t_lst.append(t) # # for t in t_lst: # print(‘***‘, t.result()) # 通过提交任务到线程池中的方法返回得到的结果对象,从而获取到任务的返回值,阻塞在这里等待执行完的任务然后拿到执行完任务的返回结果。所有任务执行结束后这里解除阻塞 # # print(‘线程池中的任务执行结束,得到了所有返回值‘) # 线程池中的回调函数 import time from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 def func(n): time.sleep(0.5) print(n) return n def call_back(n): print(‘回调‘, n.result()) # 得到任务返回的结果,返回是结果对象,所以要result()才可得到任务的返回值 if __name__ == ‘__main__‘: tpool = ThreadPoolExecutor(max_workers=5) # 创建一个线程池,池子里存放5个线程,效率最好的话,这个参数还是为CPU数*5比较好些 for i in range(20): tpool.submit(func, i).add_done_callback(call_back) # 异步提交任务到线程池中,让线程池开始调度,同时指定了回调函数,此时已经开始调度执行了. tpool.shutdown() print(‘线程池中的任务执行结束,得到了所有返回值‘)
以上是关于线程池的主要内容,如果未能解决你的问题,请参考以下文章