• Python进价系列 - 16讲 多进程


    在这篇文章中我们讨论如何在Python中使用multiprocessing模块。

    • 如何创建并启动多个进程
    • 如何等待进程结束
    • 如何在进程间共享数据
    • 如何使用锁来防止竞争条件
    • 如何使用Queue进行流程安全的数据/任务处理。
    • 如何使用Pool管理多个工作进程

    创建和运行进程

    你可以使用multiprocessing.Process()来创建一个进程。它有两个重要的参数:

    • target: 一个可调用对象(函数),这个进程将在进程启动时被调用。
    • args: 函数参数。元组。

    实例:

    from multiprocessing import Process
    import os
    
    
    def square_numbers():
        for i in range(1000):
            result = i * i
    
    if __name__ == "__main__":
        processes = []
        
        num_processes = os.cpu_count()
        print(num_processes) # 计算机中的CPU数量
        # 构造多个进程
        for _ in range(num_processes):
            process = Process(target=square_numbers)
            processes.append(process)
        # 执行进程、等待进程结束
        for process in processes:
            process.start()
            process.join()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在进程间共享数据

    既然进程不在同一个内存空间,那么它们就没有访问同一个(公开)数据的权限。
    因此,它们需要特殊的共享内存对象来共享数据。

    数据可以通过ValueArray来存储在共享内存中:

    • Value(type, value): 创建一个ctypes对象的类型是type。访问值使用.target
    • Array(type, value): 创建一个ctypes数组,其元素的类型是type。访问值使用[]

    任务:创建两个进程,每个进程都应该访问共享变量,并修改它(在这种情况下,只增加它重复100次)。
    创建两个进程,每个进程都应该访问共享变量,并修改它(在这种情况下,只增加它重复100次)。

    from multiprocessing import Process, Value, Array
    import time
    
    # 增加100次
    def add_100(number):
        for _ in range(100):
            time.sleep(0.01)
            number.value += 1
    
    # number中每个位置增加100次
    def add_100_array(numbers):
        for _ in range(100):
            time.sleep(0.01)
            for i in range(len(numbers)):
                numbers[i] += 1
    
    
    if __name__ == "__main__"
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【Hyperledger Fabric 学习】运行一个Fabric应用
    【富文本编辑器】Ueditor的demo——创建、修改——代码使用
    TorchVision Transforms API 大升级,支持目标检测、实例/语义分割及视频类任务
    什么是capturing lambda
    SimpleChannelInboundHandler使用总结
    梯度下降法求解BP神经网络的简单Demo
    前端 -- 单选框内容影响复选框的隐藏与显示 附代码
    C与C++字符串分割方法示例汇总
    羽夏看Linux内核——环境搭建
    倒置边框半径卡片
  • 原文地址:https://blog.csdn.net/pythontip/article/details/126825254