多进程/多线程实例代码

本文介绍了如何使用Python的concurrent.futures模块创建线程池和进程池进行并行任务处理。重点讨论了线程池与进程池在内存管理和资源消耗上的差异,以及如何通过executor.submit()和as_completed()方法进行任务提交和结果获取。同时,还提到了concurrent.futures.wait()函数在等待任务完成的应用。
摘要由CSDN通过智能技术生成

1.当你使用 concurrent.futures.ThreadPoolExecutor() 来创建线程池时,你可以将需要并行执行的代码放在 executor.submit() 方法中。这样,线程池会负责管理线程的创建和销毁,以及任务的调度和执行

import concurrent.futures

def your_task(argument):
    # 这是你想要并行处理的任务的代码
    # 在这里编写你的任务逻辑
    result = argument * 2
    return result

# 创建一个 ThreadPoolExecutor 对象
with concurrent.futures.ThreadPoolExecutor() as executor:
    # 提交任务到线程池,并获取 Future 对象列表
    # 这里的任务可以是任何可调用对象,这里使用了一个简单的函数作为示例
    arguments = [1, 2, 3, 4, 5]
    results = [executor.submit(your_task, arg) for arg in arguments]

    # 获取每个任务的结果
    for future in concurrent.futures.as_completed(results):
        # 注意:as_completed() 返回的是 future 对象的生成器,它会在每个任务完成时产生一个 future
        # 可以通过 future.result() 方法获取任务的结果
        result = future.result()
        print("Result:", result)

这个示例中,your_task 函数代表了你想要并行处理的任务。arguments 列表包含了传递给任务的参数。使用 executor.submit() 方法提交任务到线程池,并返回一个 Future 对象,代表了任务的执行状态和结果。然后通过 concurrent.futures.as_completed() 函数迭代 Future 对象,以获取每个任务的结果

2.与线程池不同,进程池中的每个任务都会在单独的进程中执行,这意味着它们具有独立的内存空间,因此适用于 CPU 密集型任务。但是需要注意的是,由于进程之间的通信开销比线程高得多,因此在某些情况下,多线程可能比多进程更有效

import concurrent.futures

def your_task(argument):
    # 这是你想要并行处理的任务的代码
    # 在这里编写你的任务逻辑
    result = argument * 2
    return result

# 创建一个 ProcessPoolExecutor 对象
with concurrent.futures.ProcessPoolExecutor() as executor:
    # 提交任务到进程池,并获取 Future 对象列表
    # 这里的任务可以是任何可调用对象,这里使用了一个简单的函数作为示例
    arguments = [1, 2, 3, 4, 5]
    results = [executor.submit(your_task, arg) for arg in arguments]

    # 获取每个任务的结果
    for future in concurrent.futures.as_completed(results):
        # 注意:as_completed() 返回的是 future 对象的生成器,它会在每个任务完成时产生一个 future
        # 可以通过 future.result() 方法获取任务的结果
        result = future.result()
        print("Result:", result)

  1. 资源消耗

    • 多线程:线程共享同一进程的内存空间,因此线程间的通信相对较快、开销较小。但是线程之间共享内存也可能导致数据竞争和同步问题
    • 多进程:每个进程有自己独立的内存空间,进程间的通信需要额外的开销,例如使用管道、共享内存或者队列。但是多进程避免了由于共享内存带来的竞争和同步问题。
  2. 并发性

    • 多线程:由于线程共享同一进程的资源,线程之间的切换开销比较小,适合于 I/O 密集型任务,例如网络请求文件操作
    • 多进程:每个进程都有自己的独立资源,适合于 CPU 密集型任务,例如大量的计算或者数据处理任务

concurrent.futures.wait(futures) 函数用于等待给定的一组 futures 对象完成执行。在多线程或多进程的情况下,通常会将一组任务提交给线程池或进程池,并通过 executor.submit() 方法获取这些任务的 Future 对象列表。在这种情况下,你可能想要等待所有任务都完成后再继续执行下面的代码。

import concurrent.futures

def your_task(argument):
    # 这是你想要并行处理的任务的代码
    # 在这里编写你的任务逻辑
    result = argument * 2
    return result

# 创建一个 ThreadPoolExecutor 或 ProcessPoolExecutor 对象
with concurrent.futures.ThreadPoolExecutor() as executor:
    arguments = [1, 2, 3, 4, 5]
    futures = [executor.submit(your_task, arg) for arg in arguments]

    # 等待所有任务完成
    completed, not_completed = concurrent.futures.wait(futures)

    # 处理已完成的任务结果
    for future in completed:
        result = future.result()
        print("Result:", result)

    # 处理未完成的任务,例如取消或重新提交
    for future in not_completed:
        # 取消未完成的任务
        future.cancel()

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值