首页 > 系统相关 >浅谈对进程的理解

浅谈对进程的理解

时间:2024-04-09 21:31:39浏览次数:22  
标签:__ 浅谈 process print 理解 time 进程 multiprocessing

一、多任务的概念

1、举个栗子

思考:我们在使用网盘下载资料的时候,为什么要多个任务同时下载呢?

答:多个任务同时执行可以大大提高程序的执行效率

2、提出问题

问题:利用我们目前所学的技术,我们能否实现多任务操作呢?

答:不能,因为之前所写的程序都是单任务的,也就是说一个函数或者方法执行完成 , 另外一个函数或者方法才能执行。要想实现多个任务同时执行就需要使用多任务。多任务的最大好处是充分利用CPU资源,提高程序的执行效率。

3、什么是多任务

多任务是指在同一时间内执行多个任务。

例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

4、多任务的两种表现形式

① 并发

② 并行

5、并发操作

并发:在一段时间内交替去执行多个任务。

例如:对于单核cpu处理多任务,操作系统轮流让各个任务交替执行,假如:软件1执行0.01秒,切换到软件2,软件2执行0.01秒,再切换到软件3,执行0.01秒……这样反复执行下去, 实际上每个软件都是交替执行的 . 但是,由于CPU的执行速度实在是太快了,表面上我们感觉就像这些软件都在同时执行一样 . 这里需要注意单核cpu是并发的执行多任务的。

6、并行操作

并行:在一段时间内真正的同时一起执行多个任务。

对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。这里需要注意多核cpu是并行的执行多任务,始终有多个任务一起执行。

二、进程的概念

1、程序中实现多任务的方式

在Python中,想要实现多任务可以使用==多进程==来完成。

2、进程的概念

进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。

例如:正在运行的qq , 微信等 他们都是一个进程。

注: 一个程序运行后至少有一个进程

3、多进程的作用

☆ 未使用多进程

思考:

​ 图中是一个非常简单的程序 , 一旦运行hello.py这个程序 , 按照代码的执行顺序 , func_a函数执行完毕后才能执行func_b函数 . 如果可以让func_a和func_b同时运行 , 显然执行hello.py这个程序的效率会大大提升 .

☆ 使用了多进程

三、多进程完成多任务

1、多进程完成多任务

① 导入进程包
import multiprocessing
​
② 通过进程类创建进程对象 
进程对象 = multiprocessing.Process() 
​
③ 启动进程执行任务
进程对象.start()

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

进程对象 = multiprocessing.Process([group [, target=任务名 [, name]]])

参数说明:

参数名说明
target执行的目标任务名,这里指的是函数名(方法名)
name进程名,一般不用设置
group进程组,目前只能使用None

3、进程创建与启动的代码

边听音乐边敲代码:

import multiprocessing
import time
​
​
def music():
    for i in range(3):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding():
    for i in range(3):
        print('敲代码...')
        time.sleep(0.2)
​
if __name__ == '__main__':
    music_process = multiprocessing.Process(target=music)
    coding_process = multiprocessing.Process(target=coding)
​
    music_process.start()
    coding_process.start()

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

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

参数说明:

参数名说明
args以元组的方式给执行任务传参,args表示调用对象的位置参数元组,args=(1,2,'anne',)
kwargs以字典方式给执行任务传参,kwargs表示调用对象的字典,kwargs={'name':'anne','age':18}

案例:args参数和kwargs参数的使用

import multiprocessing
import time
​
​
def music(num):
    for i in range(num):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
music_process = multiprocessing.Process(target=music, args=(3, ))
coding_process = multiprocessing.Process(target=coding, kwargs={'count': 3})
​
music_process.start()
coding_process.start()

案例:多个参数传递

import multiprocessing
import time
​
​
def music(num, name):
    for i in range(num):
        print(name)
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_process = multiprocessing.Process(target=music, args=(3, '多任务开始'))
    coding_process = multiprocessing.Process(target=coding, kwargs={'count': 3})
​
    music_process.start()
    coding_process.start()

四、获取进程编号

1、进程编号的作用

当程序中进程的数量越来越多时 , 如果没有办法区分主进程和子进程还有不同的子进程 , 那么就无法进行有效的进程管理 , 为了方便管理实际上每个进程都是有自己编号的。

2、两种进程编号

① 获取当前进程编号

getpid()

② 获取当前进程的父进程ppid = parent pid

getppid()

3、获取当前进程编号

import os
​
​
def work():
    # 获取当前进程的编号
    print('work进程编号', os.getpid())
    # 获取父进程的编号
    print('work父进程的编号', os.getppid())
    
​
work()

案例:获取子进程编号

import multiprocessing
import time
import os
​
​
def music(num):
    print('music>> %d' % os.getpid())
    for i in range(num):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    print('coding>> %d' % os.getpid())
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_process = multiprocessing.Process(target=music, args=(3, ))
    coding_process = multiprocessing.Process(target=coding, kwargs={'count': 3})
​
    music_process.start()
    coding_process.start()

案例:获取父进程与子进程编号

import multiprocessing
import time
import os
​
​
def music(num):
    print('music>> %d' % os.getpid())
    print('music主进程>> %d' % os.getppid())
    for i in range(num):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    print('coding>> %d' % os.getpid())
    print('music主进程>> %d' % os.getppid())
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    print('主进程>> %d' % os.getpid())
    music_process = multiprocessing.Process(target=music, args=(3, ))
    coding_process = multiprocessing.Process(target=coding, kwargs={'count': 3})
​
    music_process.start()
    coding_process.start()

五、进程应用注意点

1、进程间不共享全局变量

实际上==创建一个子进程就是把主进程的资源进行拷贝产生了一个新的进程==,这里的主进程和子进程是互相独立的。

案例:

import multiprocessing
​
my_list = []
​
​
def write_data():
    for i in range(3):
        my_list.append(i)
        print('add:', i)
    print(my_list)
​
​
def read_data():
    print('read_data', my_list)
​
​
if __name__ == '__main__':
    # 创建写入数据进程
    write_process = multiprocessing.Process(target=write_data)
    # 创建读取数据进程
    read_process = multiprocessing.Process(target=read_data)
​
    # 启动进程执行相关任务
    write_process.start()
    time.sleep(1)
    read_process.start()

原理分析:

三个进程分别操作的都是自己进程里面的全局变量my_list, 不会对其它进程里面的全局变量产生影响,所以进程之间不共享全局变量,只不过进程之间的全局变量名字相同而已,但是操作的不是同一个进程里面的全局变量。

知识点小结:

创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

2、主进程与子进程的结束顺序

代码演示:

import multiprocessing
import time
​
​
# 工作函数
def work():
    for i in range(10):
        print('工作中...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子进程
    work_process = multiprocessing.Process(target=work)
    # 启动子进程
    work_process.start()
​
    # 延迟1s
    time.sleep(1)
    print('主进程执行完毕')

执行结果:

☆ 解决方案一:设置守护进程

import multiprocessing
import time
​
​
# 工作函数
def work():
    for i in range(10):
        print('工作中...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子进程
    work_process = multiprocessing.Process(target=work)
    # 设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
    work_process.daemon = True
    # 启动子进程
    work_process.start()
​
    # 延迟1s
    time.sleep(1)
    print('主进程执行完毕')

☆ 解决方案二:销毁子进程

import multiprocessing
import time
​
​
# 工作函数
def work():
    for i in range(10):
        print('工作中...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子进程
    work_process = multiprocessing.Process(target=work)
    # 启动子进程
    work_process.start()
​
    # 延迟1s
    time.sleep(1)
    
    # 让子进程直接销毁,表示终止执行, 主进程退出之前,把所有的子进程直接销毁就可以了
    work_process.terminate()
    
    print('主进程执行完毕')

提示: 以上两种方式都能保证主进程退出子进程销毁

标签:__,浅谈,process,print,理解,time,进程,multiprocessing
From: https://blog.csdn.net/qq_55451220/article/details/137568049

相关文章

  • 进程间通信(管道)
    进程间通信(管道)一、关于创建管道的类(1)创建管道的类Pipe([duplex])在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象强调一点:必须在产生Process对象之前产生管道duplex默认管道是全双工的,如果将duplex射成False,conn1只能用于接收,conn2......
  • 进程间通信(队列和生产者消费者模型)
    进程间通信(队列和生产者消费者模型)一、关于进程间通信[1]什么是进程间通信(Inter-ProcessCommunication,IPC)进程间通信(Inter-ProcessCommunication,IPC)是指两个或多个进程之间进行信息交换的过程。它是一种计算机编程技术,用于在不同进程之间共享数据和资源。[2]如何实......
  • 进程池和线程池
    进程池和线程池一、什么是池无论是开设进程还是开设线程,都需要消耗资源只不过开始线程消耗的资源比开始进程相对少一些硬件的开发速度永远赶不上软件开发速度我们的宗旨是保证计算机硬件正常工作的情况下最大程度的利用它池是用来保证计算机硬件安全的情况下最大......
  • 【云原生篇】深入理解K8S CNI、CRI 和 CSI
    在Kubernetes(K8s)生态系统中,CNI、CRI和CSI是三个关键的接口,它们分别代表ContainerNetworkInterface、ContainerRuntimeInterface和ContainerStorageInterface。这些接口定义了Kubernetes如何与网络、容器运行时和存储系统进行交互,使得Kubernetes能够与......
  • ssh连接理解
    SSH登录过程 1.初见SSHSSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。SSH仅仅是一协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案。使用范围最广泛的当然是开源实现OpenSSH。2.SSH工作原理在讨论SSH的原理和使用前,我们需要分......
  • 驱动程序进程[chatgpt]
    在Windows操作系统中,驱动程序本身并没有进程号。进程号是与用户空间进程相关的标识符,用于标识正在运行的进程。然而,在驱动程序与进程之间可能存在一些关联。例如,驱动程序可能与特定的进程通信,或者驱动程序可能被特定的进程加载和使用。从驱动程序的角度来看,可以通过与用户空间......
  • 说说你对算法中时间复杂度,空间复杂度的理解?如何计算?
    一、前言算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别衡量不同算法之间的优劣主要是通过时间和空间两个维度去考量:时间维度:是指执行当前算法所消耗的时间,我......
  • 线上服务Java进程假死快速排查、分析
    服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下:请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响应请求了;该Java进程占比CPU较高,高达132.8%。使用top命令查看服务器整体运行情况:可以看到PID为14760的Java进程CPU占比132.8%,内存占用37.6%,......
  • 【稳定性】浅谈团队如何做好系统稳定性
    背景稳定性建设需要一系列具体的建设活动推进和落地,这些建设活动涉及人员、机制和文化,全方位的建设活动才能更好地落实建设模式。一、稳定性保障机制稳定性涉及团队所有不同水平技术人员、所有系统、研发所有环节、线上时时刻刻,单个技术人员是无法保障好的,必须建立团队流程机......
  • 深度解读RAGFlow的深度文档理解DeepDoc
    4月1日,Infinity宣布端到端RAG解决方案RAGFlow开源,仅一天收获上千颗星,到底有何魅力?我们来安装体验并从代码层面来分析看看。安装体验服务器需要有docker,或者直接访问官方提供的demo:https://demo.ragflow.io/docker-compose安装需要确保vm.max_map_count不小于2621......