多线程和多进程

1. 使用Python的 concurrent.futures 模块

        Python3.2带来了 concurrent.futures 模块,这个模块具有线程池和进程池、管理并行编程任务、处理非确定性的执行流程、进程/线程同步等功能。

此模块由以下部分组成:

concurrent.futures.Executor: 这是一个虚拟基类,提供了异步执行的方法。
submit(function, argument): 调度函数(可调用的对象)的执行,将 argument 作为参数传入。
map(function, argument): 将 argument 作为参数执行函数,以 异步 的方式。
shutdown(Wait=True): 发出让执行者释放所有资源的信号。
concurrent.futures.Future: 其中包括函数的异步执行。Future对象是submit任务(即带有参数的functions)到executor的实例。
        Executor是抽象类,可以通过子类访问,即线程或进程的 ExecutorPools 。因为,线程或进程的实例是依赖于资源的任务,所以最好以“池”的形式将他们组织在一起,作为可以重用的launcher或executor。

1.1 线程池和进程池

    线程池或进程池是用于在程序中优化和简化线程/进程的使用。通过池,你可以提交任务给executor。池由两部分组成,一部分是内部的队列存放着待执行的任务;另一部分是一系列的进程或线程用于执行这些任务。池的概念主要目的是为了重用:让线程或进程在生命周期内可以多次使用。它减少了创建创建线程和进程的开销,提高了程序性能。重用不是必须的规则,但它是程序员在应用中使用池的主要原因。

1.2 代码实例

import concurrent.futures
import time
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def evaluate_item(x):
        # 计算总和,这里只是为了消耗时间
        result_item = count(x)
        # 打印输入和输出结果
        return result_item

def  count(number) :
        for i in range(0, 10000000):
                i=i+1
        return i * number

if __name__ == "__main__":
        # 顺序执行
        start_time = time.time()
        for item in number_list:
                print(evaluate_item(item))
        print("Sequential execution in " + str(time.time() - start_time), "seconds")
        # 线程池执行
        start_time_1 = time.time()
        with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
                futures = [executor.submit(evaluate_item, item) for item in number_list]
                for future in concurrent.futures.as_completed(futures):
                        print(future.result())
        print ("Thread pool execution in " + str(time.time() - start_time_1), "seconds")
        # 进程池
        start_time_2 = time.time()
        with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
                futures = [executor.submit(evaluate_item, item) for item in number_list]
                for future in concurrent.futures.as_completed(futures):
                        print(future.result())
        print ("Process pool execution in " + str(time.time() - start_time_2), "seconds")

代码解释

这段代码使用 Python 的 `concurrent.futures` 模块来并行执行任务。

1. 创建线程池:

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:

concurrent.futures.ThreadPoolExecutor` 类创建一个线程池,用于管理多个线程。
max_workers=5 表示线程池中最多可以创建 5 个线程。

2. 提交任务:

futures = [executor.submit(evaluate_item, item) for item in number_list]

executor.submit(evaluate_item, item) 将 `evaluate_item` 函数作为任务提交到线程池中执行,并将 `item` 作为参数传递给 `evaluate_item` 函数。
`futures` 是一个包含所有任务的列表。

3. 等待任务完成:

for future in concurrent.futures.as_completed(futures):

* `concurrent.futures.as_completed(futures)` 返回一个迭代器,用于遍历已经完成的任务。
* 循环遍历 `as_completed(futures)`,依次处理每个完成的任务。

总结:

这段代码使用线程池并行执行 `evaluate_item` 函数,并打印每个任务执行的结果。

注意:

* `evaluate_item` 函数需要你自己定义,它应该是可以并行执行的任务。
* `number_list` 是一个包含任务参数的列表。
* `max_workers` 参数可以根据你的实际情况调整,一般建议设置为 CPU 核心数。

**希望以上解释能帮助你理解这段代码。**

 

 

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值