美文网首页
python进线程——线程池ThreadPoolExecutor

python进线程——线程池ThreadPoolExecutor

作者: TheRightPath1 | 来源:发表于2020-02-28 16:03 被阅读0次

1. ThreadPoolExecutor的简单使用

from concurrent.futures import ThreadPoolExecutor
from time import sleep


def method(times):
    sleep(times)
    print('sleep {} secondes'.format(times))
    return times


# max_workers参数用来控制线程池中运行的最大线程数
pool = ThreadPoolExecutor(max_workers=2)
# 通过submit方法将任务提交到线程池中,一次只能提交一个.submit会立即返回结果
# 第一个参数是函数名,第二个参数是函数的参数,他是一个元组
# submit方法返回的task是一个future对象
task1 = pool.submit(method, (2))
task2 = pool.submit(method, (3))
# 通过done方法来判断任务是否运行完成
print('任务1运行状态:', task1.done())
sleep(3)
print('任务1运行状态:', task1.done())
# 通过cancel犯方法来取消任务.但如果任务是在运行中或者运行完成是取消不了的,必须是未开始运行
print('任务2是否取消:', task2.cancel())
# 通过result方法来获取任务运行的返回值
print('任务一运行结果:', task1.result())
print('任务二运行结果:', task2.result())

运行结果

任务1运行状态: False
sleep 2 secondes
任务1运行状态: True
任务2是否取消: False
任务一运行结果: 2
sleep 3 secondes
任务二运行结果: 3

2.获取线程池中已经运行完的任务结果

方法一: 使用as_completed函数

from concurrent.futures import ThreadPoolExecutor, as_completed
from time import sleep


def method(times):
    sleep(times)
    print('sleep {} secondes'.format(times))
    return times


pool = ThreadPoolExecutor(max_workers=2)
seconds = [i for i in range(10)]
tasks = [pool.submit(method, (second)) for second in seconds]
# as_completed函数会将运行完的任务一个一个yield出来
# 它返回任务的结果与提交任务的顺序无关,谁先执行完返回谁
for future in as_completed(tasks):
    print(future.result())

运行结果

sleep 0 secondes
0
sleep 1 secondes
1
sleep 2 secondes
2
sleep 3 secondes
3
sleep 4 secondes
4
sleep 5 secondes
5
sleep 6 secondes
6
sleep 7 secondes
7
sleep 8 secondes
8
sleep 9 secondes
9

方法二: 使用map方法

from concurrent.futures import ThreadPoolExecutor
from time import sleep


def method(times):
    sleep(times)
    print('sleep {} secondes'.format(times))
    return times


pool = ThreadPoolExecutor(max_workers=2)
seconds = [i for i in range(4)]
# map方法会将任务运行的结果yield出来
# map方法返回任务结果的顺序与提交任务的顺序一致
for data in pool.map(method, seconds):
    print(data)

运行结果

sleep 0 secondes
0
sleep 1 secondes
1
sleep 2 secondes
2
sleep 3 secondes
3

3.wait方法

wait方法用于阻塞主线程的运行, 可以设置当某些子线程运行完成以后再继续执行主线程
其第一个参数是future对象或future对象列表,return_when参数用于指定当哪些任务运行完成时继续执行主线程,其参数有:
FIRST_COMPLETED = 'FIRST_COMPLETED'
FIRST_EXCEPTION = 'FIRST_EXCEPTION'
ALL_COMPLETED = 'ALL_COMPLETED'
_AS_COMPLETED = '_AS_COMPLETED'

相关文章

网友评论

      本文标题:python进线程——线程池ThreadPoolExecutor

      本文链接:https://www.haomeiwen.com/subject/hddlhhtx.html