「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。
正式的Python专栏第74篇,同学站住,别错过这个从0开始的文章!
前面的一些文章,我们看了使用ThreadPoolExecutor的submit方法提交一个任务,接着获取future对象,对future对象的状态进行解析。
后面准备讲进程池了,但是在分享进程池之前,我们先了解一下进程跟子进程。
进程概念
本篇只是作为一个补充,所以学委不会重新梳理进程的全部概念,下面是一段摘取自百科的关于进程的解释:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
所以到底什么是进程?
比较感性的认识是这样: 我们运行一个python程序的时候,就有一个进程在运行。
然后使用下面代码可以获取进程信息:
pid = os.getpid()#获取当前进程ID
如果使用系统的工具,比如ps工具(或者Windows里面使用tasklist任务管理查看)是可以找到这个进程的。
下面截图为,学委运行了一段python程序的时候,使用ps命令查找到进程ID(PID)的展示:
这是上述进程展示的示例代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/2/26 12:10 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : process.py
# @Project : DeepDivePython
import os
import time
from datetime import datetime
pid = os.getpid()
i = 0
while i < 5:
i += 1
time.sleep(3)
print("当前进程ID:", pid, ', 执行时间 ', datetime.now())
复制代码
上述代码每格3秒输出一次进程ID,重复了5次。
学委之前也花了很多篇幅分享了线程。
那么线程和进程之间又是什么关系呢?
学习过操作系统的同学都清楚这个,可以再次回忆一下。
下面学委准备了代码展示:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/2/26 12:10 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : process.py
# @Project : DeepDivePython
import os
import threading
import time
from datetime import datetime
pid = os.getpid()
i = 0
for i in range(3):
def demo(slogan):
time.sleep(4)
print("我是一个进程内的一个线程, slogan:", slogan)
threading.Thread(target=demo, kwargs={"slogan": "学委demo进程"}).start()
i =0
while i < 3:
i += 1
time.sleep(3)
print("当前进程ID:", pid, ', 执行时间 ', datetime.now())
复制代码
进程是线程运行的容器。
如果线程是一个活动的个体,一个学生,那么进程就像一个班级。
不同进程之间互相独立,就像不同班级之间互相保持边界。
当然严格上来说,线程,进程这些跟学生班级没有非常严格的关系,仅用来比喻描述它们成对的关系。
这是运行结果:
之前我们也展示过每个程序都有一个主线程,然后这个主线程可以创建其他线程。
那么对于进程来说,是否有主次之分,是否有类似的创建其他进程呢?
是的。但是我们通常说的是父进程与子进程。
子进程的创建
os内置库给我们提供了一个fork方法:
import os
pid = os.fork() #从父进程中fork(分化衍生出)一个子进程,此时pid的值为子进程ID
复制代码
fork方法如果返回值分两种情况:
-
如果是父进程调用,则返回子进程的PID
-
如果是子进程调用,则返回0.
下面看一段demo就清楚了:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/2/26 12:10 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : process1.py
# @Project : DeepDivePython
import os
from datetime import datetime
pid = os.fork()
print("雷学委demo进程/ 当前进程ID:", pid, ', 执行时间 ', datetime.now())
if pid > 0:
print("父进程 PID:", os.getpid())
print("子进程 PID:", pid)
else:
print("子进程 PID:", os.getpid())
print("父进程 PID:", os.getppid())
复制代码
运行结果如下:
总结
python内的os库给我们提供了一些方便的方法,轻松的获取到进程信息。
关于进程,我们需要学习的知识不止于本篇讲述的。但是对于新手来说,可以先把本篇介绍的代码和概念都务必学会,同时理解线程和进程的关系和区别。
对于进程感兴趣的读者可以翻翻操作系统,查看更全面的知识,夯实基础。
下篇我们再继续分享进程池。
喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!