Python多进程

一、单进程示例

举例一个吃饭活动,有一碗汤和一碗饭,正常操作是一口饭一口汤(当然你先把汤或者饭一口气吃完,当我无话可说)。单进程只能是先吃完饭,再喝汤;或者是先喝完汤,再吃饭。

看代码

import time
def drink():
    for i in range(3):
        print("喝汤……")
        time.sleep(1)

def eat():
    for i in range(3):
        print("吃饭……")
        time.sleep(1)

if __name__ == '__main__':
    eat()
    drink()

运行结果如下

先吃完了所有饭,再喝完所有汤 ,显然这种结果不是我们想要的

二、多进程的实现

进程的创建步骤

1、导入进程包

import multiprocessing

2、通过进程类创建进程对象

进程对象 = multiprocessing.Process(target=*)

此处target的值可以是函数名称 

3、启动进程执行任务

进程对象.start()

看代码示例

import multiprocessing
import time
def drink():
    for i in range(3):
        print("喝汤……")
        time.sleep(1)

def eat():
    for i in range(3):
        print("吃饭……")
        time.sleep(1)

if __name__ == '__main__':
    #target:指定函数名
    drink_process = multiprocessing.Process(target=drink)
    eat_process = multiprocessing.Process(target=eat)

    drink_process.start()
    eat_process.start()

运行结果

 可以看到喝汤和吃饭交叉进行

三、带参多进程

这地方用到的是args和kwargs,其中args是使用元素组的方式给指定任务传参,kwargs是使用字典方式给指定任务传参。

args使用方式

进程对象 = multiprocessing.Process(target=*,args=(*,))

此处注意,若只有一个元素,那个逗号也是不可以省略的

kwargs使用方式

进程对象 = multiprocessing.Process(target=*,kwargs={"变量名": 变量值})

还是以上面吃饭喝汤为例子写代码

import time
import multiprocessing


def eat(num,name):
    for i in range(num):
        print(name+"吃一口……")
        time.sleep(1)


def drink(num,name):
    for i in range(num):
        print(name+"喝一口……")
        time.sleep(1)


if __name__ == '__main__':
    # target:指定执行的函数名
    # args:使用元组方式给指定任务传参
    # kwargs:使用字典方式给指定任务传参
    eat_process = multiprocessing.Process(target=eat,args=(3,"giao"))
    drink_process = multiprocessing.Process(target=drink,kwargs={"num": 4,"name":"giao"})

    eat_process.start()
    drink_process.start()

执行结果

可以看到参数成功的传入到了所要执行的任务中

四、获取进程的编号

1、获取当前进程的编号

os.getpid()

2、获取当前进程的父进程的编号

os.getppid()

还是以吃饭喝汤为例,看代码

import time
import multiprocessing
import os


def eat(num,name):
    print("吃饭的进程ID:", os.getpid())
    print("吃饭的主进程ID:", os.getppid())
    for i in range(num):
        print(name+"吃一口……")
        time.sleep(1)


def drink(num,name):
    print("喝汤的进程ID:", os.getpid())
    print("喝汤的主进程ID:", os.getppid())
    for i in range(num):
        print(name+"喝一口……")
        time.sleep(1)


if __name__ == '__main__':
    # target:指定执行的函数名
    # args:使用元组方式给指定任务传参
    # kwargs:使用字典方式给指定任务传参
    eat_process = multiprocessing.Process(target=eat,args=(3, "giao"))
    drink_process = multiprocessing.Process(target=drink,kwargs={"num": 4, "name":"giao"})
    print("主进程ID:", os.getpid())

    eat_process.start()
    drink_process.start()

结果如图

可以清楚的看到,正常情况下,吃饭和喝汤的父进程是同一个进程,而吃饭和喝汤有不同的进程编号。

进程注意点

1、主进程会等待所有的子进程执行结束再结束

看代码示例

import multiprocessing
import time


def eat():
    for i in range(10):
        print("我吃我吃……")
        time.sleep(0.5)


if __name__ == '__main__':
    eat_process = multiprocessing.Process(target=eat)
    eat_process.start()

    time.sleep(1)
    print("我吃饱了……")

运行结果如图

发现主进程显示已经吃饱了,但是子进程还是在吃,程序等到子进程运行完,才结束。 

2、可以设置子进程守护,当主进程结束时,子进程也不再继续执行,直接结束。

只需要在创建进程之后,加入这样一句代码

进程名称.daemon = True

这样子进程就会守护主进程,主进程结束,子进程也会自动销毁。

看代码

import multiprocessing
import time


def eat():
    for i in range(10):
        print("我吃我吃……")
        time.sleep(0.5)


if __name__ == '__main__':
    eat_process = multiprocessing.Process(target=eat)
    # 设置进程守护
    eat_process.daemon = True
    eat_process.start()

    time.sleep(1)
    print("我吃饱了……")

运行结果如图

可以明确看到,主进程结束后,子进程不再继续执行,直接销毁。 

Python的多线程在这

Python中,可以使用`multiprocessing`模块来创建多个进程。`multiprocessing`提供了一种简单的方式来利用多核CPU并行执行任务。以下是一个示例代码,展示了如何使用`multiprocessing`创建多个进程: ```python import multiprocessing # 定义一个任务函数 def process_image(image): # 在这里编写你的图像处理代码 # ... pass # 定义要处理的图像列表 images = [...] # 创建进程池 pool = multiprocessing.Pool() # 使用进程池并行处理图像 results = pool.map(process_image, images) # 关闭进程池 pool.close() pool.join() # 处理处理结果 for result in results: # 处理每个图像的处理结果 # ... ``` 在上述示例代码中,我们首先定义了一个任务函数`process_image`,该函数接受一个图像作为输入,可以在其中编写图像处理的代码。然后,我们定义了一个要处理的图像列表`images`。 接下来,我们使用`multiprocessing.Pool()`创建一个进程池。进程池可以管理一组工作进程,并自动分配任务给这些进程。在这个例子中,我们将使用进程池来并行处理图像。 使用`pool.map()`方法,可以将任务函数和任务数据传递给进程池,并自动分配给可用的工作进程进行处理。该方法会返回一个包含所有任务结果的列表。 最后,我们关闭进程池并等待所有进程完成任务,使用`pool.close()`和`pool.join()`方法。 需要注意的是,`multiprocessing`模块创建的每个进程都有自己独立的内存空间,因此需要注意进程间的数据传递和通信。在上述示例中,我们使用了`pool.map()`方法来自动将任务和数据分配给工作进程,并获取处理结果。如果需要更复杂的进程间通信,可以使用`multiprocessing`模块提供的其他工具,如`Queue`、`Pipe`等。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值