zoukankan      html  css  js  c++  java
  • 浅谈concurrent.futures模块的进程池与线程池

    Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持。

    ProcessPoolExecutor进程池

    我们来看一个最简单的进程池

     1 from concurrent.futures import ProcessPoolExecutor
     2 import  time
     3 def task(arg):
     4     print("arg:",arg)
     5     time.sleep(1)
     6 
     7 if __name__ == "__main__":
     8     start = time.time()
     9     pool = ProcessPoolExecutor(3) #设置线程数
    10 
    11     for i in range(6):
    12         pool.submit(task,i) #在线程池中取一个线程执行task函数
    13     pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
    14 
    15     print("main")
    16     end = time.time()
    17     print(end - start)

    执行结果:

    下面我们把shutdown(wait=True)改成shutdown(wait=False)

     1 from concurrent.futures import ProcessPoolExecutor
     2 import  time
     3 def task(arg):
     4     print("arg:",arg)
     5     time.sleep(1)
     6 
     7 if __name__ == "__main__":
     8     start = time.time()
     9     pool = ProcessPoolExecutor(3) #设置线程数
    10 
    11     for i in range(6):
    12         pool.submit(task,i) #在线程池中取一个线程执行task函数
    13     pool.shutdown(wait=False) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
    14 
    15     print("main")
    16     end = time.time()
    17     print(end - start)

    再来看执行结果   

    submit同步模式(同步调用:提交/调用一个任务,然后就在原地等着,等到该任务执行完毕拿到结果,再执行下一行代码

     1 from concurrent.futures import ProcessPoolExecutor
     2 import  time
     3 import os
     4 def task(arg):
     5     print('%s is piaoing %s' % (arg, os.getpid()))
     6     time.sleep(1)
     7 
     8 if __name__ == "__main__":
     9     start = time.time()
    10     pool = ProcessPoolExecutor(3) #设置线程数
    11 
    12     for i in range(6):
    13         pool.submit(task,i).result() #在线程池中取一个线程执行task函数
    14         print(i)
    15     pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
    16 
    17     print("main")
    18     end = time.time()
    19     print(end - start)

    执行结果 

    ThreadPoolExecutor线程池

    我们来看一个最简单的线程池

     1 from concurrent.futures import ThreadPoolExecutor
     2   import  time
     3   def task(arg):
     4       print("arg:",arg)
     5       time.sleep(1)
     6   
     7   if __name__ == "__main__":
     8       start = time.time()
     9       pool = ThreadPoolExecutor(3) #设置线程数
    10  
    11      for i in range(6):
    12          pool.submit(task,i) #在线程池中取一个线程执行task函数
    13      pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
    14  
    15      print("main")
    16      end = time.time()
    17      print(end - start)

    运行结果

    ThreadPoolExecutor线程池和ProcessPoolExecutor进程池语法和执行结果一样,只是需要导入的模块名称和调用的模块名称不同,在这就不再赘述。

  • 相关阅读:
    Django学习-9-ORM多对多操作
    Django学习-8-模板渲染的一些特性
    Django学习-7-ORM操作
    Django学习-6-路由系统
    Hadoop 知识
    最全的Spark基础知识解答
    windows server 2008 R2 远程连接用户数修改
    Windows 2008 R2 SP1部署WSUS 3.0 SP2
    Windows Server2008 R2 设置NAT 让Hyper-V连接Internet
    免费好用的Microsoft iSCSI Software Target 3.3
  • 原文地址:https://www.cnblogs.com/songtao1600/p/9014022.html
Copyright © 2011-2022 走看看