concurrent模块的使用

Posted marklijian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了concurrent模块的使用相关的知识,希望对你有一定的参考价值。

concurrent模块

进程池和线程池

池的功能限制进程数或线程数.

当需要并发的进程或线程太多,远大于操作所能承受的最大数量时,

使用线程池或进程池控制程序产生的进程数或线程数,来防止操作系统受到太大的压力从而导致服务器宕机

下面两个模块都是在concurrent文件夹中的futures文件夹下的py文件

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor

进程池

from concurrent.futures import ProcessPoolExecutor
import time

def run():
    print(123)
    time.sleep(0.5)
    print(234)
    return "我是最终结果"
def call_back(future):
    print(future.result())

if __name__ == '__main__':
    pool = ProcessPoolExecutor(3)
    for i in range(10):
        future = pool.submit(run)
        future.add_done_callback(call_back)

    pool.shutdown()
    print("用了shutdown以后我最后在打印")

ProcessPoolExecutor

pool = ProcessPoolExecutor(n)

  • 开启进程池,设置进程池里进程的个数为n

future = pool.submit(task,i)

  • 将任务放到进程池中
  • task——任务名
  • i——任务参数
  • future——生成的任务对象

pool.shutdown()

  • 等待进程池中的所有任务都完成在执行代码

future.result()

  • 获得任务的返回值
  • 注意,使用这个方法,会阻塞住线程池任务的执行,使任务都变成串行
  • 解决方案
    • 使用列表每个任务的对象保存起来,
      最后再从列表中统一取出返回值
    • future.add_done_callback(parse)
      • 回调函数
      • 当对象线程结束时候,会自动回调parse这个函数执行

线程池

from concurrent.futures import ThreadPoolExecutor
import time

def run():
    print(123)
    time.sleep(4)
    print(234)
def call_back(future):
    print(future.result())

if __name__ == '__main__':
    pool = ThreadPoolExecutor(3)
    for i in range(10):

        future = pool.submit(run)
        future.add_done_callback(call_back)

    pool.shutdown()
    print("用了shutdown以后我最后在打印")

ThreadPoolExecutor

pool = ThreadPoolExecutor(n)

  • 开启线程池,设置线程池里线程的个数为n

future = pool.submit(task,i)

  • 将任务放到线程池中
  • task——任务名
  • i——任务参数
  • future——生成的任务对象

pool.shutdown()

  • 等待进程池中的所有任务都完成,再执行代码

future.result()

  • 获得任务的返回值
  • 注意,使用这个方法,会阻塞住线程池任务的执行,使任务都变成串行
  • 解决方案
    • 使用列表每个任务的对象保存起来,
      最后再从列表中统一取出返回值
    • future.add_done_callback(parse)
      • 回调函数
      • 当对象线程结束时候,会自动回调parse这个函数执行

同步、异步、阻塞和非阻塞

同步

  • 就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回

异步

  • 当一个异步过程调用发出后,调用者不能立刻得到结果。
  • 实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞

  • 指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

XMind: ZEN - Trial Version

以上是关于concurrent模块的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用concurrent.futures模块并发,实现进程池线程池

concurrent.futures模块与协程

35concurrent.futures模块与协程

Python程序中的线程操作(线程池)-concurrent模块

创建进程池与线程池concurrent.futures模块的使用

Python程序中的线程操作-concurrent模块