Python进价系列 - 16讲 多进程

本文深入探讨了Python中的多进程编程,包括如何创建和运行进程、进程间共享数据、理解锁的作用以及如何解决竞争条件。还介绍了使用队列进行进程间通信以及进程池的概念,为高效并行处理提供了实用的方法和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这篇文章中我们讨论如何在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()

在进程间共享数据

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

数据可以通过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__"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值