设为首页 加入收藏

TOP

python —— 进程(一)
2019-06-21 00:06:10 】 浏览:119
Tags:python 进程

目录

1. 进程

  • 1.进程就是一个运行中的程序(是对正在运行程序的一个抽象)。

  • 2.程序和进程之间的区别:

    • 程序只是一个文件
    • 进程是这个文件被CPU运行起来了
    • 程序是永久的,进程是暂时的。
  • 3.进程—是计算机中最小的资源分配单位
    在操作系统中的唯一标识符 :pid

    注意:同一个程序执行两次,就会在操作系统中出现两个进程,所以我们可以同时运行一个软件,分别做不同的事情也不会混乱。

  • 4.进程是数据隔离的,进程的数据隔离是由操作系统完成的。

2. 进程调度

要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。

进程的调度是由操作系统完成的(我们不能干预)。

操作系统调度进程的算法:

  • 1.短作业优先算法
  • 2.先来先服务算法
  • 3.时间片轮转
  • 4.多级反馈算法(融合了前三种算法)

3. 进程的并行与并发

  • 并行:

    两个程序、两个CPU,每个程序分别占用一个CPU自己执行自己的

    看起来是同时执行,实际在每一个时间点上都在各自执行着

  • 并发:

    两个程序、一个cpu,每个程序交替的在一个cpu上执行

    看起来在同时执行,但是实际上仍然是串行

4. 同步异步阻塞非阻塞

  • 1.同步

    同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

    简单说:调用一个方法,要等待这个方法结束。

    如:烧水 和 吹头发
        正在烧水
        停下烧水这个动作去吹头发
        吹完头发之后继续烧水
  • 2.异步

    异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列

    简单说:调用一个方法,不等待这个方法结束,也不关心这个方法做了什么。

    如:烧水 和 吹头发
        正在烧水
        开始吹头发,但烧水也在继续进行
  • 3.阻塞

    cpu不工作

    阻塞影响了程序运行的效率。

  • 4.非阻塞

    cpu工作

  • 5.同步阻塞

    效率最低

    例1:conn.recv

    ? socket 阻塞的tcp协议的时候

    例2:你专心排队,什么别的事都不做。

  • 6.同步非阻塞

    实际上是效率低下的

    例1:func() 没有io操作

    ? socket 非阻塞的tcp协议的时候

    ? 调用函数(这个函数内部不存在io操作)

    例2:你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

  • 7.异步非阻塞

    效率更高

    例:把func扔到其他任务里去执行了

    ? 我本身的任务和func任务各自执行各自的,没有io操作

  • 8.异步阻塞

    异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

    如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;

5. 进程的三状态图

在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。

  • 1.就绪(Ready)状态

    当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

  • 2.执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

  • 3.阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

6. multiprocessing模块

multiprocessing—— multi:multiple 多元的 processing 进程

import os
import time
print('start')
time.sleep(20)
print(os.getpid(),os.getppid(),'end')

os.getpid() 获取当前进程的pid

pid process id 子进程

ppid parent process id 父进程

父进程:在父进程中创建子进程

  • 在pycharm中启动的所有py程序都是pycharm的子进程
import os
import time
from multiprocessing import Process

def func():
    print('start',os.getpid())
    time.sleep(1)
    print('end',os.getpid())

if __name__ == '__main__':
    p = Process(target=func)
    p.start()   # 异步 调用开启进程的方法,但是并不等待这个进程真的开启
    print('main :',os.getpid())
    
    
import os
import time
from multiprocessing import Process

def eat():
    print('start eating',os.getpid())
    time.sleep(1)
    print('end eating',os.getpid())

def sleep():
    print('start sleeping',os.getpid())
    time.sleep(1)
    print('end sleeping',os.getpid())

if __name__ == '__main__':
    p1 = Process(target=eat)    # 创建一个即将要执行eat函数的进程对象
    p1.start()                  # 开启第一个子进程
    p2 = Process(target=sleep)  # 创建一个即将要执行sleep函数的进程对象
    p2.start()                  # 开启第二个子进程
    print('main :',os.getpid())

1.小知识补充:

if __name__ == '__main__':

  • 控制当这个py文件被当作脚本直接执行的时候,就执行这里面的代码
  • 当这个py文件被当作模块导入的时候,就不执行这里面的代码

__name__有两种情况:

  • __name__ == '__main__'

    执行的文件就是__name__所在的文件

  • `name == '文件名'``

    `__name__所在的文件被导入执行的时候

2.操作系统创建进程的方式不同:

  • windows操作系统执行开启进程的代码

    实际上新的子进程需要通过import父进程的代码来完成数据的导入工作(再一次执行父进程文件中的代码来获取父进程中的数据),所以有一些内容我们只希望在父进程中完成,就写在if __name__ == '__main__':下面

  • ios linux操作系统创建进程 fork

    正常的写就可以,不需要写if __name__ == '__main__'

3.主进程和子进程之间的关系:

  • 主进程没结束 :等待子进程结束
  • 主进程负责回收子进程的资源
  • 如果子进程执行结束,父进程没有回收资源,那么这个子
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python如何以表格形式打印输出 下一篇python-django中的APPEND_SLASH实..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目