让我们由浅到深----------深刻了解python中进程创建、使用、管理等等。。。。。。

简介: 让我们由浅到深----------深刻了解python中进程创建、使用、管理等等。。。。。。

**

什么是进程?

**

1、在早期面向过程设计的计算机结构中,过程是程序的基本执行实体;在当代面向线程设计的计算机体系结构中,进程是线程的容器。它是对指令、数据及其组织形式的描述,过程是程序的实体。多通道程序在执行时需要共享系统资源,这就导致了各个程序在执行过程中相互制约,程序的执行呈现出不连续性的特点。

2、进程是关于数据集的独立程序的运行活动。它可以申请并拥有系统资源,这是一个动态概念和活动实体。它不仅是程序的代码,也是当前活动,由程序计数器的值和处理寄存器的内容表示。

3、进程是操作系统中最基本、最重要的概念。它是多道程序设计系统出现后引入的一个概念,用来描述系统内部的动态情况,描述系统内部各个程序的活动规律。所有多道程序设计操作系统都基于该过程。过程的本质是多通道程序系统中程序的执行过程。该过程是动态生成的,并动态终止。


看到上面的进程解释是不是非常的晕,事实上我看着也很晕,下面我们就来了解什么是进程吧。

在我看来进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是程序的实体。进程就是程序。


下面让我们用例子来说明一下什么是进程及python中进程如何使用的

**

进程例子,了解进程创建和分配

**

# TODO 导入进程的包
import multiprocessing    # 进程包
import time
# 1.work1
def work():
    for i in range(5):
        print("work正在工作中.....")
        time.sleep(0.2)
# 2.work2
def work2():
    for i in range(5):
        print("work2正在工作中......")
        time.sleep(0.2)
if __name__=="__main__":    #  TODO  主进程
    # TODO 两个子进程
    work_process=multiprocessing.Process(target=work,name="work1Process")
    work2_process=multiprocessing.Process(target=work2)
    #   启动子进程任务
    work_process.start()
    work2_process.start()

运行结果:

work正在工作中.....
work2正在工作中......
work2正在工作中......work正在工作中.....
work正在工作中.....
work2正在工作中......
work2正在工作中......
work正在工作中.....
work2正在工作中......
work正在工作中.....

运行结果:

work2正在工作中......
work正在工作中.....
work正在工作中.....work2正在工作中......
work2正在工作中......work正在工作中.....
work2正在工作中......work正在工作中.....
work正在工作中.....work2正在工作中......

你多次运行会发现每次的运行结果基本上都不相同,是不是很奇怪,那是因为进程是随机分配的,毫无规律可言。

进程有主进程和子进程。例如一个程序中的主函数是最先执行的,调度和分配函数,那么主进程就是主函数**if __name__=="__main__":,子进程就是被调度(调用)的函数work():和work2()**,主线程起到控制子线程的作用。


想要更好的了解代码就要了解进程代码中各个元素的含义,下面让我们来一起看一下。image.png

work_process=multiprocessing.Process(target=work,name="work1Process")
work2_process=multiprocessing.Process(target=work2)

这两行代码,两行都是主函数(主进程)分配两个子进程(被调用的函数)****【也可以成为程序中除主函数的其他函数】,target是进程执行的目标函数,也就是这个进程分配的对象,name是进程的名字(不写就默认),可写可不写,不过方便后面查看进程的名字我们将第一个子进程起一个名字。

work_process.start()

start 开启进程,work_process是前面创建(分配)进程的名字,work_process.start()即为开启创建的work_process进程。


**

获取进程编号

**

multiprocessing.current_process() 获取当前进程的名字(name)

os.getppid() 获取父进程

注意:使用os.getppid()要先引入os包(import os),os包一般用于对文件的处理。

import os     #  一般用于文件处理
import multiprocessing    # 进程包
import time
# 1.work1
def work():
    print("当前work:",os.getpid())
    #  TODO  当前的进程名
    print("work:",multiprocessing.current_process())
    #  TODO  获取父进程
    print("work的父进程是:",os.getppid())
    for i in range(5):
        print("work正在工作中.....")
        time.sleep(0.2)
# 2.work2
def work2():
    for i in range(5):
        #  TODO  当前的进程名
        print("work2:", multiprocessing.current_process())
        #  TODO  获取父进程
        print("work2的父进程是:", os.getppid())
        print("当前work2:", os.getpid())
        print("work2正在工作中......")
        time.sleep(0.2)
if __name__=="__main__":    #  TODO  主进程
    print("main:",os.getpid())
    # TODO 两个子进程
    work_process=multiprocessing.Process(target=work,name="work1Process")
    work2_process=multiprocessing.Process(target=work2)
    #   启动子进程任务
    work_process.start()
    work2_process.start()
multiprocessing.Process()

运行结果:

main: 12700
当前work:work2: 31648
 work: <Process name='Process-2' parent=12700 started>
<Process name='work1Process' parent=12700 started>
work的父进程是: 12700
work2的父进程是: work正在工作中.....12700
当前work2: 31856
work2正在工作中......
work正在工作中.....
work2: <Process name='Process-2' parent=12700 started>
work2的父进程是: 12700
当前work2: 31856
work2正在工作中......
work正在工作中.....
work2: <Process name='Process-2' parent=12700 started>
work2的父进程是: 12700
当前work2: 31856
work2正在工作中......
work正在工作中.....
work2: <Process name='Process-2' parent=12700 started>
work2的父进程是: 12700
当前work2: 31856
work2正在工作中......
work正在工作中.....
work2: <Process name='Process-2' parent=12700 started>
work2的父进程是: 12700
当前work2: 31856
work2正在工作中......
Process finished with exit code 0

我们可以清晰地发现进程的名字和当前进程的父进程。****work1Process和Process-2,**前者是我们自己起的名字,如果没有起会默认为Process-1。进程一旦分配除非遇到内存限制,资源不够等特殊情况(程序不能继续执行下去),进程会一直运行下去且进程名不变。也就是说进程名会和我们的名字一样,出生到死亡一辈子都是这个名字,中途改名对应的就是计算机所发生的特殊情况(内存不够、程序出错等原因)


**

进程执行带有参数的任务

**

进程执行传参操作,字典、元组等,为后面大型项目做铺垫,可能现在的项目单个进程和多个进程还没有很好的体现,但是后面随着项目规模的变大,你会很好的发现单进程和多进程的区别。所以了解进程十分重要


元组传参:

import os     #  一般用于文件处理
import multiprocessing    # 进程包
import time
# 1.work1
def work(count,number):
    print("当前work:",os.getpid())
    #  TODO  当前的进程名
    print("work:",multiprocessing.current_process())
    #  TODO  获取父进程
    print("work的父进程是:",os.getppid())
    for i in range(5):
        print("work正在工作中.....")
        time.sleep(0.2)
## 2.work2
# def work2(count,number):
#     for i in range(5):
#         #  TODO  当前的进程名
#         print("work2:", multiprocessing.current_process())
#         #  TODO  获取父进程
#         print("work2的父进程是:", os.getppid())
#         print("当前work2:", os.getpid())
#         print("work2正在工作中......")
#         time.sleep(0.2)
if __name__=="__main__":    #  TODO  主进程
    print("main:",os.getpid())
    # TODO 两个子进程
    work_process=multiprocessing.Process(target=work,args=(5,10))
    # work2_process=multiprocessing.Process(target=work2,kwargs={"count":5,"number":10})
    #   启动子进程任务
    work_process.start()
    # work2_process.start()
multiprocessing.Process()

运行结果:

main: 11896
当前work: 23728
work: <Process name='Process-1' parent=11896 started>
work的父进程是: 11896
work正在工作中.....
work正在工作中.....
work正在工作中.....
work正在工作中.....
work正在工作中.....

元组传参就是主进程将数据以元组的方式传递给子进程,类似于python中调用一个函数,通过元组的方式传参。不太理解的可以去了解一下Python的传参过程,很重要,想要掌握python就必须要掌握它。

元组格式 (1,5,3)、(“小红”,“小花”,“18”)、(2,)

注意:一个元素是要加一个逗号

python中的元素交换

a,b=b,a

这样就可以交换a,b的值

字典传参:

import os     #  一般用于文件处理
import multiprocessing    # 进程包
import time
# 1.work1
# def work(count,number):
#     print("当前work:",os.getpid())
#     #  TODO  当前的进程名
#     print("work:",multiprocessing.current_process())
#
#     #  TODO  获取父进程
#     print("work的父进程是:",os.getppid())
#     for i in range(5):
#         print("work正在工作中.....")
#         time.sleep(0.2)
# 2.work2
def work2(count,number):
    for i in range(5):
        #  TODO  当前的进程名
        print("work2:", multiprocessing.current_process())
        #  TODO  获取父进程
        print("work2的父进程是:", os.getppid())
        print("当前work2:", os.getpid())
        print("work2正在工作中......")
        time.sleep(0.2)
if __name__=="__main__":    #  TODO  主进程
    print("main:",os.getpid())
    # TODO 两个子进程
    # work_process=multiprocessing.Process(target=work,args=(5,10))
    work2_process=multiprocessing.Process(target=work2,kwargs={"count":5,"number":10})
    #   启动子进程任务
    # work_process.start()
    work2_process.start()

time.sleep(0.2) 休息0.2s,如果不休息0.2s你会发现太顺畅,结果一下子就出来了,休息0.2s可以更好地看清楚进程运行

运行结果:

main: 18372
work2: <Process name='Process-1' parent=18372 started>
work2的父进程是: 18372
当前work2: 13016
work2正在工作中......
work2: <Process name='Process-1' parent=18372 started>
work2的父进程是: 18372
当前work2: 13016
work2正在工作中......
work2: <Process name='Process-1' parent=18372 started>
work2的父进程是: 18372
当前work2: 13016
work2正在工作中......
work2: <Process name='Process-1' parent=18372 started>
work2的父进程是: 18372
当前work2: 13016
work2正在工作中......
work2: <Process name='Process-1' parent=18372 started>
work2的父进程是: 18372
当前work2: 13016
work2正在工作中......
Process finished with exit code 0

字典传参就是主进程将数据以字典的方式传递给子进程,类似于python中调用一个函数,通过字典的方式传参。不太理解的可以去了解一下Python的传参过程,很重要,想要掌握python就必须要掌握它。 **字典和元组都是python常见的两种格式,其中字典是以键对值存在的,就是一把药匙一个门,键就是药匙,值就是门,可能一把药匙可以开n个门,但是一个门不可能同时存在多个药匙。也就是说,键不可以重复,是唯一的,但是值可以重复。所以通常可以通过键去提取值。**上文提点传参就是将数据以字典的形式传出去。


只要是进程你反复运行结果都是不一样的,因为进程是系统随机分配的,基本上不可能重复,如果你反复运行是重复的,恭喜你,你可以买彩票了,别忘了叫上我。


注意:

守护主进程:

   deamo = True

子进程销毁

   terminate

退出进程

exit()

常用属性

name:当前进程起别名,默认为Process-1,依次递增

实例方法:

 start()

启动子进程实例(创建子进程)

   join()

等待子进程执行结束

  terminate()

不管任务是否执行完毕,立即终止子进程.

目录
相关文章
|
16天前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
22 0
|
4月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
4月前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
268 1
|
5月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
4月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
57 0
|
5月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
69 3
|
6月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
103 3
|
6月前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
106 10
|
5月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
64 0
|
6月前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
90 6

热门文章

最新文章