Python3中官方才正式提供线程池。
线程不是开的越多越好,开的多了可能会降低系统性能。

线程池的使用

  1. import time
  2. from concurrent.futures import ThreadPoolExecutor
  3. # pool = ThreadPoolExecutor(100)
  4. # pool.submit(函数名,参数1,参数2,参数...)
  5. def task(url, num):
  6. print("开始执行任务", url)
  7. time.sleep(5)
  8. # 创建线程池,最多维护10个线程。
  9. pool = ThreadPoolExecutor(10)
  10. url_list = ["沐风-{}".format(i) for i in range(300)]
  11. for url in url_list:
  12. # 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。
  13. pool.submit(task, url, 2)
  14. print("end")

等待线程池

等待线程池的任务执行完毕

  1. import time
  2. from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED
  3. # pool = ThreadPoolExecutor(100)
  4. # pool.submit(函数名,参数1,参数2,参数...)
  5. def task(url):
  6. print("开始执行任务", url)
  7. time.sleep(5)
  8. start = time.time()
  9. # 创建线程池,最多维护10个线程。
  10. pool = ThreadPoolExecutor(10)
  11. url_list = ["沐风-{}".format(i) for i in range(30)]
  12. for url in url_list:
  13. # 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。
  14. pool.submit(task, url)
  15. print("线程执行中...")
  16. pool.shutdown(True) # 等待线程池中的任务执行完毕后,在继续执行
  17. print('线程执行完...')
  18. end = time.time()
  19. print('cost time: ', round(end - start)) # cost time: 15s
  20. print("end")

线程的返回值

获取线程的返回值。

  1. # 语法一
  2. import time
  3. import random
  4. from concurrent.futures import ThreadPoolExecutor, Future
  5. def task(url):
  6. print("开始执行任务", url)
  7. time.sleep(2)
  8. return random.randint(0, 10)
  9. def done(response):
  10. '线程执行完毕后,获取每个线程的返回值'
  11. print("任务执行后的返回值", response.result())
  12. # 创建线程池,最多维护10个线程。
  13. pool = ThreadPoolExecutor(10)
  14. url_list = ["沐风-{}".format(i) for i in range(15)]
  15. for url in url_list:
  16. # 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。
  17. future = pool.submit(task, url)
  18. future.add_done_callback(done) # 是子主线程执行
  19. # 可以做分工,例如:task专门下载,done专门将下载的数据写入本地文件。
  1. # 语法二
  2. import time
  3. import random
  4. from concurrent.futures import ThreadPoolExecutor, Future
  5. def task(url):
  6. print("开始执行任务", url)
  7. time.sleep(2)
  8. return random.randint(0, 10)
  9. # 创建线程池,最多维护10个线程。
  10. pool = ThreadPoolExecutor(10)
  11. future_list = list()
  12. url_list = ["沐风-{}".format(i) for i in range(15)]
  13. for url in url_list:
  14. # 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。
  15. future = pool.submit(task, url)
  16. future_list.append(future)
  17. pool.shutdown(True)
  18. for fu in future_list:
  19. print(fu.result())