线程池编程

2020 年 06 月 04 日 • 阅读数: 149

线程池

线程池简介

  • 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
  • 当一个线程完成的时候,我们主线程立即知道
  • futures 可以让多线程编码接口一致
import time
from concurrent.futures import ThreadPoolExecutor, as_completed, wait, FIRST_COMPLETED
def get_html(times):
    print("get page {} success".format(times))
    time.sleep(times)
    return times
  • 创建一个线程池,这里接收一个参数,表示最大线程个数
  • 通过线程池对象的submit方法,向线程池中提交一个函数,启动一个新线程
  • submit方法会立即返回一个futures对象
executor = ThreadPoolExecutor(max_workers=2)
task1 = executor.submit(get_html,(4))
task2 = executor.submit(get_html,(2))
get page 4 success
get page 2 success
  • futures对象包含一些内置方法,可以判断线程的执行状态
  • done方法用于判定某个任务是否完成
  • cancel方法可以取消某个任务(只能在线程执行之前有效)
  • result方法可以获取某个任务的执行结果
print(type(task2))
print(task2.result())
print(task1.result())
<class 'concurrent.futures._base.Future'>
2
4
  • 可以批量提交数据,然后用as_completed来获取已经成功的线程,需要一个futures对象的列表
  • as_completed是一个生成器对象,它会首先判断列表里的futures对象是否有已经完成的线程
  • 如果有已经完成的线程,直接返回出来,如果没有,则阻塞主进程
%%time
urls = [2,4,3,5]
all_task= [executor.submit(get_html, (url)) for url in urls]
time.sleep(3)
for future in as_completed(all_task):
    data = future.result()
    print(data)
print('end')
get page 2 success
get page 4 success
get page 3 success
2
get page 5 success
4
3
5
end
CPU times: user 0 ns, sys: 12 ms, total: 12 ms
Wall time: 9.01 s
  • 在线程池对象中也有一个批量提交线程的方法
  • 并且该方法可以直接获取到线程执行的返回值
for data in executor.map(get_html, urls):
    print(data)
get page 2 success
get page 4 success
get page 3 success
2
get page 5 success
4
3
5
  • 使用wait函数可以阻塞主线程,默认直到全部线程执行完
  • 也可以通过return_when参数进行指定,开放阻塞的时间
%%time
urls = [2,4,3,5]
all_task= [executor.submit(get_html, (url)) for url in urls]
wait(all_task)
for future in as_completed(all_task):
    data = future.result()
    print(data)
print('end')
get page 2 success
get page 4 success
get page 3 success
get page 5 success
2
4
5
3
end
CPU times: user 8 ms, sys: 0 ns, total: 8 ms
Wall time: 9.01 s

Future源码分析

  • future对象也被称为未来对象,在向线程池提交数据之后,就会返回一个future对象
  • 这个时候我们提交的任务是还没有完成的,但是也许会在将来的某个时间完成,所以叫做未来对象
  • 也可以看作是一个task的返回容器,它里面存放了task的执行结果,和执行状态

没怎么听懂。。。

标签: Python多线程
添加评论
评论列表
没有更多内容