python_thread

Posted xdl_smile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_thread相关的知识,希望对你有一定的参考价值。

多任务编程:可以有效的利用计算机资源,同时执行多个任务
进程:进程就是程序在计算机中一次执行的过程
进程 和 程序的区别:
    1、程序是一个静态文件的描述,不占计算机的系统资源
    2、进程是一个动态的过程,占有cpu、内存等资源,有一定的生命周期
注意:同一个程序的不同执行过程即为不同的进程
问题1、什么决定了进程的创建
    答:用户通过应用层程序进行进程的创建申请-->调用操作系统接口进行进程创建
        -->告知系统内核创建新的进程提供给应用层使用
问题2、进程如何占有CPU
    1、同一个内核同一时刻只能运行一个进程
    2、多个进程对内核资源进行抢占,由操作系统内核进行分配
    3、哪个进程占有计算机内核,我们称为该进程占有CPU的时间片
问题3、进程在运行过程中的形态和附带内容
    1、PCB(进程控制块):在linux和unix操作系统中,进程创建后会在内存中开辟一块空间存放进程的相关信息,这个空间称之PCB
    2、PID:在操作系统中进程的唯一标识,是一个大于0的正整数,由系统自动分配
       ps -aux 查看进程信息
    3、虚拟内存:每个进程占有4G内存地址空间,这里的内存指的是虚拟内存
    4、进程状态
        1、三态:
            1、就绪态:进程具备运行条件,等待系统分派处理器以便运行
            2、运行态:进程占有CPU处于运行状态
            3、等待态:又称为阻塞态或睡眠态,指进程不具备运行条件,正在等待某些条件的达成
        2、五态:在三态的基础上添加两个状态新建态、终止态
            1、新建态:创建一个进程的过程,直接表现为执行某个程序或在程序中创建新的进程
            2、终止态:进程执行结束,完成回收的过程
        D:等待态(不可中断,不会被外界条件所影响)
        S:等待态(可中断,会被伟杰条件所影响)
        T:等待太(暂停,无条件的等待)
        R:运行态
        Z:僵尸态
            上面只能选一个,后面的是配合上面使用的
        +:前台进程
        N:低优先级进程
        <:高优先级进程
        l:有进程连接
        s:会话组
进程的优先级:
    1、优先级往往决定了一个进程的执行权限和占有系统资源的优先程度
    2、linux系统中优先级范围 -20~19 -20优先级最高
    3、用户创建的进程默认优先级为0
    4、top:动态查看系统进程运行情况,(NI字段值就是优先级)
       <  > 可以用来翻页查询
    5、nice:以指定的优先级运行某个进程
        示例: nice -9 ./while.py  #以9的优先级运行程序

             sudo nice --9 ./while.py #以-9的优先级运行程序
    6、renice n PID:修改一个正在运行的进程的优先级
        示例:renice 8 12836 :将12836号的进程优先级修改为8
父子进程:在系统中除了初始化进程之外每个进程都是由父进程创建的,每个进程有一个唯一的父进程,可能有多个子进程
        pstree:查看进程树
总结:
    1、什么是进程:程序在计算机中一次执行的过程
    2、进程和程序的区别:进程是动态的占有cup内存资源,程序是静态文件,不占有从cpu内存资源
    3、进程的集中状态及相互间的转换
    4、什么是PCB PID CPU时间片

需求:两件不想关的事情希望同时来做

方案1:创建两个进程,分别承担不同的事情,各自执行
分析:
    1、两个程序比较麻烦
    2、无法确定两个程序应该在什么时间开始运行
方案2:写一个程序,在程序中指定位置用接口来创建新的进程

    实现方法:
        1、os.fork()函数实现
fork()
    1、功能:创建一个新的进程
    2、参数:无
    3、返回值:
        1、<0表示进程创建失败
        2、==0在子进程中fork的返回值为0
        3、>0在父进程中fork的返回值大于0
fork 是os模块只能在linux和Unix系统下使用

技术分享图片
#os 模块提供大量和系统相关的功能函数接口
#os 模块的使用是与系统相关的,在不同的系统中可能有不同的功能
import os

print(before craete process)
a = 10
pid = os.fork()
if pid < 0:
    print("Create process failed")
elif pid == 0:
    print(This is the new process)
    print(a)#a=10:父进程中fork之前的内容,子进程同样也会复制,但是父子进程空间内容的修改不会相互影响
    print(os.getpid())
    a = 1000
else:
    print(This is the parent process)
    print(a)#a=10:但是父子进程空间内容的修改不会相互影响
    print(pid)#pid的值等于子进程的PID
print("The process end")
View Code

测试1:父进程中fork之前的内容,子进程同样也会复制,但是父子进程空间内容的修改不会相互影响
测试2:父子进程在执行上互不影响,理论上不一定谁先执行
测试3:子进程虽然复制父进程的空间,但是也有自己独特的特性,比如:自己的PID,进程控制块,进程栈等,父进程中的fork的返回      值即为创建子进程的PID号
进程相关的函数:
    1、os.getpid():       获取当前进程的PID号
    2、os.getppid():       获取当前进程父进程的PID号
    3、os._exit(status)  
        1、功能:结束一个进程
        2、参数:一个数字(必须是整数)表示进程的退出状态,通常0表示正常退出,其它数字表示非正常退出
    4、sys.exit([status])  
        1、功能:结束一个进程,如果处理了抛出异常,则不结束进程
        2、参数:一个数字表示进程的退出状态,通常0表示正常退出,其它数字表示非正常退出,
               还可以是一个字符串,如果是字符串则退出进程会打印这个字符串

技术分享图片
import os
import sys

# os._exit(0)
try:
    #如果处理了抛出异常,则不结束进程
    sys.exit(0)#参数可有可无,如果是字符串会打印这个字符串(小数视为字符串),
except SystemExit as e:
    print(e)    #次数的参数就是exit传进去的参数

print(process over)
View Code

僵尸进程:
    1、定义:子进程先于父进程退出,父进程没有对子进程的退出做相应的处理,此时子进程就会变成僵尸进程
    2、影响:进程退出后,仍有部分信息残留在内存空间,大量的僵尸进程会影响系统运行,    所以应该尽量避免僵尸进程的产生

孤儿进程:
    1、定义:父进程先于子进程退出,此时子进程就会变为孤儿进程
    2、影响:当一个进程变为孤儿进程,系统会自动的使用一个进程成为孤儿进程的父进程。当孤儿进程退出时,该系统进程会自动
            回收孤儿,使他不会成为僵尸,所以孤儿进程对系统资源没有什么影响
处理僵尸进程的方法:
    1、让父进程先退出(不好控制)
    2、父进程处理子进程的退出
        1、os.wait():
            1、功能:等待子进程退出进行处理
            2、参数:无
            3、返回值:返回一个包含两个元素的元组,第一个是退出的子进程的PID号,第二个是子进程的退出状态
            4、wait是一个阻塞函数 即 进程处于等待态,等待某种条件的达成才会继续运行

技术分享图片
import os
import sys
from time import *

pid = os.fork()
if pid < 0:
    print(create process failed)
elif pid == 0:
    print(Child process...)
    print(Child_PID:,os.getpid())
    sleep(2)
    sys.exit("ok11")#子进程退出
else:
    #wait阻塞等待子进程的退出
    p,status = os.wait()#p等于子进程的PID,status等于exit参数为正值时的值乘以256
    print(p,status)#如果退出状态是字符串时,status的值为256
    print(os.WEXITSTATUS(status))#等于子进程退出的状态
    print(Parent process..)
View Code

        2、os.waitpid(pid,option)
            1、功能:同wait 处理子进程退出使其不会变成僵尸
            2、参数:pid=-1时 表示等待任意子进程退出
                    pid>0时 表示等待指定进程号的子进程退出
                    option=0时 表示阻塞等待
                    option = os.WNOHANG时 表示 非阻塞等待

技术分享图片
import os
import sys
from time import *

pid = os.fork()
if pid < 0:
    print(create process failed)
elif pid == 0:
    print(Child process...)
    print(Child_PID:,os.getpid())
    sleep(2)
    sys.exit(1)#子进程退出
else:
    #waitpid非阻塞等待子进程的退出:如果执行到这里刚好这时子进程退出则处理,否则不处理
    p,status = os.waitpid(-1,os.WNOHANG)#p等于子进程的PID,status等于exit参数为正值时的值乘以256
    print(p,status)
    print(os.WEXITSTATUS(status))#等于子进程退出的状态
    print(Parent process..)
View Code

总结:
    1、函数的使用 fork()/getpid()/getppid()/os._exit/sys.exit/wait/waitpid
    2、理解什么是僵尸进程和孤儿进程即两者产生的过程
    3、知道僵尸进程的危害和两种处理方法
    4、理解进程的创建流程















































































































以上是关于python_thread的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器