zoukankan      html  css  js  c++  java
  • concurrent.futures模块

    1.concurrent.futures模块介绍

    2.ThreadPoolExecutor线程池使用

    3.ProcessPoolExecutor进程池使用

    4.其他方法使用

    1.concurrent.futures模块介绍

     1 # 介绍
     2     concurrent.futures模块提供了高度封装的异步调用接口
     3     ThreadPoolExecutor:线程池,提供异步调用
     4     ProcessPoolExecutor: 进程池,提供异步调用
     5 
     6 # 基本方法
     7 # submit(fn, *args, **kwargs)  异步提交任务
     8 
     9 # map(func, *iterables, timeout=None, chunksize=1)  取代for循环submit的操作
    10 
    11 # shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作
    12     wait=True,等待池内所有任务执行完毕回收完资源后才继续
    13     wait=False,立即返回,并不会等待池内的任务执行完毕
    14     但不管wait参数为何值,整个程序都会等到所有任务执行完毕
    15     submit和map必须在shutdown之前
    16 
    17 # result(timeout=None) 取得结果
    18 
    19 # add_done_callback(fn) 回调函数

    2.ThreadPoolExecutor线程池使用

     1 from concurrent.futures import ThreadPoolExecutor
     2 import time
     3 import random
     4 
     5 def task(n):
     6     print(n)
     7     time.sleep(random.randint(1, 3))
     8     return n ** 2
     9 
    10 if __name__ == '__main__':
    11     executor = ThreadPoolExecutor(max_workers=5)       # 最多5个线程
    12     futures = []
    13     for i in range(11):
    14         future = executor.submit(task, i)
    15         futures.append(future)
    16     executor.shutdown(True)
    17     print('+++>')
    18     for future in futures:
    19         print(future.result())

    3.ProcessPoolExecutor进程池使用

     1 from concurrent.futures import ProcessPoolExecutor
     2 import os
     3 import time
     4 import random
     5 
     6 def task(n):
     7     print('%s is runing' % os.getpid())
     8     time.sleep(random.randint(1, 3))
     9     return n ** 2
    10 
    11 if __name__ == '__main__':
    12     executor = ProcessPoolExecutor(max_workers=3)       # 最多3个进程
    13     futures = []
    14     for i in range(11):
    15         future = executor.submit(task, i)
    16         futures.append(future)
    17     executor.shutdown(True)
    18     print('+++>')
    19     for future in futures:
    20         print(future.result())

    4.其他方法使用

     1 # map方法使用
     2 import time
     3 from concurrent.futures import ThreadPoolExecutor
     4 
     5 def func(n):
     6     time.sleep(2)
     7     print(n)
     8     return n * n
     9 
    10 def call_back(m):
    11     print('结果是 %s' % m.result())
    12 
    13 tpool = ThreadPoolExecutor(max_workers=5) 
    14 tpool.map(func, range(20))  # 注意map方法拿不到返回值
     1 # 回调函数
     2 import time
     3 from concurrent.futures import ThreadPoolExecutor
     4 
     5 def func(n):
     6     time.sleep(2)
     7     print(n)
     8     return n * n
     9 
    10 # 回调函数
    11 def call_back(m):
    12     print('结果是 %s' % m.result())
    13 
    14 tpool = ThreadPoolExecutor(max_workers=5)
    15 for i in range(20):
    16     tpool.submit(func, i).add_done_callback(call_back)
  • 相关阅读:
    SpringCloud组件
    Lambda遍历Map集合
    转换为base64格式
    控制器注解参数判空
    SpringBoot项目使用环境变量当做端口号
    使用控制台占位符输出日志, 使用占位符Plus
    Java 传无限参数
    将yyyy-MM-dd hh:mm:ss转换为时间戳
    HTML使用svg,定义.svg格式
    演示js异步,同步请求,响应解码
  • 原文地址:https://www.cnblogs.com/wyb666/p/9772868.html
Copyright © 2011-2022 走看看