Python中的进程

本文详细介绍了Python中的进程概念,包括进程的创建、获取进程编号、进程执行带参数任务的方法,并通过代码示例展示了如何使用multiprocessing模块。同时强调了进程间的资源独立性以及注意事项,如进程间不共享全局变量,主进程会等待所有子进程执行结束。

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

目录

一、进程的简述

1. 进程的介绍

2. 进程的概念

二、进程的使用

1 创建进程

2. Process进程类的说明

3.代码示例:

三、获取进程编号

1. 获取进程编号的目的

2. 获取当前进程编号

3.代码示例:

四、进程执行带有参数的任务

1. 进程执行带有参数的任务的介绍

2. args参数的使用

3.kwargs参数的使用

五、进程的注意事项


一、进程的简述

1. 进程的介绍

在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。

2. 进程的概念

一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。

进程与线程的关系:

一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程

二、进程的使用

1 创建进程

# 导入进程包
import multiprocessing
# 创建子进程
process = multiprocessing.Process(group, target, args, kwargs, name)

2. Process进程类的说明

Process([group [, target [, name [, args [, kwargs]]]]])

  • group:指定进程组,目前只能使用None
  • target:执行的目标任务名
  • name:进程名字
  • args:以元组方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

Process创建的实例对象的常用方法:

  • start():启动子进程实例(创建子进程)
  • join():等待子进程执行结束
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

3.代码示例:

import multiprocessing
import time

def dance():
    for i in range(3):
        print('dancing')
        time.sleep(1)

def sing():
    for i in range(3):
        print('singing')
        time.sleep(1)

if __name__ == '__main__':
    # 创建子进程
    dance_process = multiprocessing.Process(target=dance)
    sing_process = multiprocessing.Process(target=sing)
    # 启动进程
    dance_process.start()
    sing_process.start()

结果显示:

dancing
singing
dancing
singing
dancing
singing

三、获取进程编号

1. 获取进程编号的目的

获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。

获取进程编号的两种操作

  • 获取当前进程编号
  • 获取当前父进程编号

2. 获取当前进程编号

os.getpid() 表示获取当前进程编号

3.代码示例:

import multiprocessing
import time
import  os

def dance():
    # 获取当前进程的编号
    print("dance:", os.getpid())
    # 获取当前进程
    print("dance:", multiprocessing.current_process())
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)
        # 扩展:根据进程编号杀死指定进程
        # os.kill(os.getpid(), 9)

def sing():
    # 获取当前进程的编号
    print("sing:", os.getpid())
    # 获取当前进程
    print("sing:", multiprocessing.current_process())
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)


if __name__ == '__main__':
    # 获取当前进程的编号
    print("main:", os.getpid())
    # 获取当前进程
    print("main:", multiprocessing.current_process())
    dance_process = multiprocessing.Process(target=dance)
    sing_process = multiprocessing.Process(target=sing)

    dance_process.start()
    sing_process.start()

结果:

main: 4243
main: <_MainProcess name='MainProcess' parent=None started>
sing: 4245
sing: <Process name='Process-2' parent=4243 started>
唱歌中...
dance: 4244
dance: <Process name='Process-1' parent=4243 started>
跳舞中...
唱歌中...
跳舞中...
跳舞中...
唱歌中...
跳舞中...唱歌中...

唱歌中...跳舞中...

 

四、进程执行带有参数的任务

1. 进程执行带有参数的任务的介绍

Process类执行任务并给任务传参数有两种方式:

  • args 表示以元组的方式给执行任务传参
  • kwargs 表示以字典方式给执行任务传参

2. args参数的使用

import multiprocessing
import time


# 带有参数的任务
def task(count):
    for i in range(count):
        print("任务执行中..")
        time.sleep(2)
    else:
        print("任务执行完成")


if __name__ == '__main__':
    # 创建子进程
    # args: 以元组的方式给任务传入参数
    sub_process = multiprocessing.Process(target=task, args=(5,))
    sub_process.start()

3.kwargs参数的使用

import multiprocessing
import time


# 带有参数的任务
def task(count):
    for i in range(count):
        print("任务执行中..")
        time.sleep(2)
    else:
        print("任务执行完成")


if __name__ == '__main__':
    # 创建子进程

    # kwargs: 表示以字典方式传入参数
    sub_process = multiprocessing.Process(target=task, kwargs={"count": 3})
    sub_process.start()

五、进程的注意事项

  1. 进程之间不共享全局变量
  2. 主进程会等待所有的子进程执行结束再结束
Python中,进程、线程和协程是实现并发编程的不同方式。 1. 进程(Process)是操作系统分配资源的基本单位,每个进程有独立的内存空间,互不干扰。进程之间的通信需要使用特定的机制,如管道、消息队列等。在Python中,可以使用`multiprocessing`模块创建和管理进程。 2. 线程(Thread)是进程内的独立执行流,一个进程可以包含多个线程,它们共享相同的内存空间。线程之间的通信比进程更方便,可以使用共享内存或者全局变量。然而,由于全局解释器锁(GIL)的存在,同一时间只有一个线程在执行Python字节码,因此多线程在CPU密集型任务中并不能提高性能。但是对于I/O密集型任务,多线程可以提升效率。Python内置的`threading`模块提供了对线程的支持。 3. 协程(Coroutine)是一种轻量级的线程,由程序控制在特定位置进行挂起和恢复的并发执行。协程能够在执行过程中被暂停和继续,并且可以通过yield语句进行交互式通信。Python中的协程通过生成器函数(generator function)和`asyncio`库来实现。 总结一下: - 进程是资源分配的基本单位,进程之间资源独立,通信复杂。 - 线程是进程内的执行流,共享内存,通信相对方便,但受到GIL的限制。 - 协程是一种轻量级的线程,可以在特定位置挂起和恢复执行,并通过yield语句进行通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值