zoukankan      html  css  js  c++  java
  • 进程

      

    一、多道技术

    1.空间上的复用

      多个程序共用一套计算机硬件

    2.时间上的复用

    切换+保存状态

      1).当一个程序遇到IO操作 操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)

      2).当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)

      time.sleep()本质和时间复用一样 睡觉时候操作系统会切换cpu。

    二、进程

    1.进程的三状态图

    2.串行、并发与并行

      串行:程序运行完才能进入下一个程序

      并发:只是看起来多个任务在同时执行。单核也可以实现并发

      并行:真正意义上的同时运行。可以指资源有限的情况下,两者交替轮流使用资源。只有多核才能实现。

    3.同步异步阻塞非阻塞

    1)、同步异步:表示的是任务的提交方式

      同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的表现就是卡住了)

      异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的 但是是用过其他方式获取)

    2)、阻塞非阻塞:表示的程序的运行状态

      阻塞:阻塞态

      非阻塞:就绪态 运行态

    三、创建进程

    1.什么是进程?

      进程指的就是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念

      为何要进程?     实现并发。

      创建进程就是在内存中重新开辟一块内存空间,将允许产生的代码丢进去。一个进程所对应的内存就是一块独立的内存空间。

      进程与进程之间数据是隔离的,无法直接交互。但是可以通过某些技术实现间接交互。

      同一个程序执行两次,也算是开启了两个进程。

    2.创建进程的两种方式

      os.cpu_count() 查看电脑是几个处理器。

      multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

      进程间没有任何共享状态,进程修改的数据,改动仅限于该进程内。

    创建进程的第一种方式
    from
    multiprocessing import Process import time def test(name): print('%s is running'%name) time.sleep(2) print('%s is over'%name) if __name__ == '__main__': p = Process(target=test,args=('li',))# 创建一个进程对象。当容器类型(此处是元组)中只有一个参数时,最好把逗号加上。
      # 第一个传函数的名字过来,第二个传函数要用到的参数。
    p.start()# 告诉操作系统帮你创建一个进程 异步 print('') #注意:windows创建进程会将代码以模块的方式,从上往下执行一遍 # linux会直接将代码完完整整的拷贝一份 # windows创建进程一定要在if __name__ == '__main__':代码块内创建 ,否则会报错
    创建进程的第二种方式
    from multiprocessing import Process
    import time
    class MyProcess(Process):
        def __init__(self,name):
            super().__init__()
            self.name = name
        def run(self):
            print('%s is running' % self.name)
            time.sleep(3)
            print('%s is over' % self.name)
    if __name__ == '__main__':
        p = MyProcess('egon')
        p.start()       #仅仅是告诉操作系统帮你创建一个进程,至于这个进程什么时候创,完全由操作系统随机决定。
        print('')

    四、程序中的相关进程用法

    1.multiprocess不是一个模块,而是python的一个操作,管理进程的包。

    2.process模块介绍及常用语句

    from multiprocessing import process       从多道处理中导入过程

    Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)

    强调:

      1). 需要使用关键字的方式来指定参数

      2). args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

    3.参数介绍:

      1 ).group参数未使用,值始终为None

      2) .target表示调用对象,即子进程要执行的任务

      3 ).args表示调用对象的位置参数元组,args=(1,2,'egon',)

      4). kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}

      5). name为子进程的名称

    4.常用方法介绍

      1)p.start():启动进程,并调用该子进程中的p.run()

      2) p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法。

      3) p.terminate():强制终止进程p,不会进行任何清理操作。

      4 )p.is_alive():判断p是否还活着。如果p仍然运行,返回True

      5) p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。

    5.join方法

      利用p.start()创建多个进程,无法准确获取到进程创建的先后顺序。仅仅是告诉操作系统帮你创建一个进程,至于这个进程什么时候创,完全由操作系统随机决定。

    6.守护进程

      会随着主程序的结束而结束。

    p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程

    主进程创建守护进程

      1)守护进程会在主进程代码执行结束后就终止

      2)守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

    注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止。

    
    
  • 相关阅读:
    安装linux下文件搜索工具ANGRYsearch,与windows下Everything类似
    windows常用软件、Linux软件对比
    在linux下双击用wine软件的打开
    好用的Linux下PDF编辑批注软件PDF Studio Pro 11
    python multiprocessing.pool.apply_async 占用内存多 解决方法
    linux 版 Fiddler 抓包软件的安装
    安装linux下强大的文件搜索工具fsearch,与windows下Everything类似
    python3 删除空文件夹
    【廖雪峰老师python教程】——错误和调试
    【廖雪峰老师python教程】——OOP
  • 原文地址:https://www.cnblogs.com/blue-tea/p/11337024.html
Copyright © 2011-2022 走看看