Python 并发补充话题 进程概念与子进程创建展示

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。

正式的Python专栏第74篇,同学站住,别错过这个从0开始的文章!

前面的一些文章,我们看了使用ThreadPoolExecutor的submit方法提交一个任务,接着获取future对象,对future对象的状态进行解析。

后面准备讲进程池了,但是在分享进程池之前,我们先了解一下进程跟子进程。

进程概念

本篇只是作为一个补充,所以学委不会重新梳理进程的全部概念,下面是一段摘取自百科的关于进程的解释:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

baike.baidu.com/item/%E8%BF…

所以到底什么是进程?

比较感性的认识是这样: 我们运行一个python程序的时候,就有一个进程在运行。

然后使用下面代码可以获取进程信息:

pid = os.getpid()#获取当前进程ID

如果使用系统的工具,比如ps工具(或者Windows里面使用tasklist任务管理查看)是可以找到这个进程的。

下面截图为,学委运行了一段python程序的时候,使用ps命令查找到进程ID(PID)的展示:

屏幕快照 2022-02-26 上午12.51.46.png

这是上述进程展示的示例代码:

#!/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())
复制代码

进程线程运行的容器

如果线程是一个活动的个体,一个学生,那么进程就像一个班级。

不同进程之间互相独立,就像不同班级之间互相保持边界。

当然严格上来说,线程,进程这些跟学生班级没有非常严格的关系,仅用来比喻描述它们成对的关系。

这是运行结果:

屏幕快照 2022-02-26 上午1.07.06.png

之前我们也展示过每个程序都有一个主线程,然后这个主线程可以创建其他线程。

那么对于进程来说,是否有主次之分,是否有类似的创建其他进程呢?

是的。但是我们通常说的是父进程与子进程。

子进程的创建

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入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

Guess you like

Origin juejin.im/post/7068675490667560997