远志

个人站

欢迎来到我的个人站~


concurrent 详解

concurrent是Python标准库中的一个模块,它提供了一些用于编写并发代码的实用工具和数据结构。在本文中,我们将深入探讨concurrent库的各个方面。

  1. 并发执行的基础

concurrent.futures模块提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,分别用于在线程和进程中执行并发任务。这两个类实现了一个通用的执行器(executor)接口,可以轻松地将任务提交到执行器中,以异步方式执行这些任务,并获得它们的结果。

  1. 并发任务的提交

通过executor.submit()方法可以将一个可调用对象(如函数或方法)提交到执行器中,并返回一个表示该任务的future对象。future对象是一个异步操作的句柄,可以用来查询该操作的状态和结果。

  1. 并发任务的结果获取

通过future.result()方法可以获取异步操作的结果,如果该操作尚未完成,则会阻塞调用线程,直到操作完成为止。future对象还提供了一些方法,如done()、cancel()、add_done_callback()等,用于查询操作状态、取消操作和注册回调函数等。

  1. 并发任务的映射

concurrent.futures模块还提供了map()和submit()方法,用于将一个可迭代对象中的元素映射到一个可调用对象,并将这些任务提交到执行器中并行执行。map()方法返回一个迭代器,用于按照原始可迭代对象中的顺序迭代异步操作的结果。submit()方法返回一个future对象列表,用于跟踪每个异步操作的状态和结果。

  1. 线程池和进程池的使用

ThreadPoolExecutor和ProcessPoolExecutor类实现了一个通用的执行器接口,用于在线程池和进程池中执行并发任务。这两个类的使用方法基本相同,主要区别在于执行任务的方式不同。

  1. 线程安全的数据结构

concurrent.futures模块还提供了一些线程安全的数据结构,如concurrent.futures.Lock、concurrent.futures.Event、concurrent.futures.Condition、concurrent.futures.Semaphore等。这些数据结构可以用于实现线程之间的同步和互斥。

  1. 异步编程

concurrent.futures模块提供了一些异步编程的实用工具,如concurrent.futures.as_completed()、concurrent.futures.wait()、concurrent.futures.ALL_COMPLETED等。这些工具可以用于协调多个异步操作,等待它们完成,并根据需要处理它们的结果。

总之,concurrent库提供了许多有用的工具和数据结构,可以帮助我们更轻松地编写并发程序。

例子:

'''
下面是一个使用concurrent.futures模块的简单例子,用于计算从1到N的所有整数的平方和,其中N是用户从命令行输入的参数。

在这个例子中,我们使用ProcessPoolExecutor类创建一个进程池,然后使用executor.submit()方法将1到N的所有整数的平方计算任务提交到执行器中,并使用concurrent.futures.as_completed()方法等待所有任务完成并返回它们的结果。最后,我们计算所有结果的总和,并将其打印到屏幕上。
'''
import concurrent.futures
import sys

def square(n):
    return n**2

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print("Usage: python square_sum.py N")
        sys.exit(1)

    try:
        N = int(sys.argv[1])
    except ValueError:
        print("N must be an integer.")
        sys.exit(1)

    with concurrent.futures.ProcessPoolExecutor() as executor:
        futures = [executor.submit(square, i) for i in range(1, N+1)]
        result = sum(future.result() for future in concurrent.futures.as_completed(futures))

    print("The sum of squares from 1 to {} is {}".format(N, result))

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦