python中线程池使用
==
TOC
这里介绍在python中使用ThreadPoolExecutor进行多线程开发。
#这里指定线程个数为3
executor = ThreadPoolExecutor(3)
Executor的submit方法:不等待每个任务结果返回
Executor的map方法:等待每个任务结果返回,有任务完成就马上返回完成任务,其它未完成任务则继续等待
使用Executor的map方法执行
使用as_completed方法等待每一个任务
使用wait方法等待所有任务
对future添加回调函数add_done_callback处理结果
Executor的shutdown方法
import time
import uuid
from concurrent.futures._base import as_completed, wait
from concurrent.futures.thread import ThreadPoolExecutor
from datetime import datetime
def hello(name):
'''
待执行任务
:param name:
:return:
'''
print('{} {}'.format(name, datetime.now()))
time.sleep(1)
return name
def hello_callback(future):
'''
待执行任务回调结果处理
:param future:
:return:
'''
print("hello_callback for task finish, r: {}".format(future.result()))
def execute_no_wait():
'''
任务执行结果不等待,通过添加回调函数处理结果
:return:
'''
executor = ThreadPoolExecutor(3)
for i in range(1, 100):
f = executor.submit(hello, uuid.uuid1())
# 通过添加回调函数处理结果
f.add_done_callback(hello_callback)
executor.shutdown()
def execute_wait_by_as_completed():
'''
任务执行结果等待,使用as_completed方法
:return:
'''
executor = ThreadPoolExecutor(3)
future_list = [executor.submit(hello, uuid.uuid1()) for i in range(1, 100)]
# 等待任务执行完成,使用as_completed方法, as_completed是一个生成器,当有任务完成时,立刻返回完成任务的结果,否则阻塞
for f in as_completed(future_list):
r = f.result()
print('{} finish'.format(r))
executor.shutdown()
def execute_wait_by_executor_map():
'''
任务执行结果等待,使用Executor.map方法执行任务
:return:
'''
executor = ThreadPoolExecutor(3)
# 使用Executor.map方法执行任务,等待返回结果,当有任务完成时,立刻返回完成任务的结果,否则阻塞
for r in executor.map(hello, [uuid.uuid1() for i in range(1, 100)]):
print('{} finish'.format(r))
executor.shutdown()
def execute_wait_by_wait():
'''
任务执行结果等待,使用wait方法等待所有任务完成
:return:
'''
executor = ThreadPoolExecutor(3)
future_list = [executor.submit(hello, uuid.uuid1()) for i in range(1, 100)]
# 使用wait方法等待所有任务完成
wait(future_list)
for f in future_list:
r = f.result()
print('{} finish'.format(r))
executor.shutdown()
def main():
execute_no_wait()
execute_wait_by_as_completed()
execute_wait_by_executor_map()
execute_wait_by_wait()
if __name__ == '__main__':
main()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。