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)
  • 相关阅读:
    [CLK Framework] CLK.Settings
    [Architecture Design] CLK Architecture
    记一次 bug 修复 , 未将对象引用实例化
    Invoke 与 BeginInvoke 应用场景
    一次发布生产版程序异常排查总结
    C# 使用 SmtpClient 发送邮件注意项
    MSSql Server 批量插入数据优化
    Window Server 布署 WCF 服务 , 权限配置问题
    C++ 值类型和引用类型传递示例
    VS2015 C#调用C++ 托管代码无法调试问题排查
  • 原文地址:https://www.cnblogs.com/wyb666/p/9772868.html
Copyright © 2011-2022 走看看