• python开发学习笔记之八(网络编程进阶)


    ---恢复内容开始---

      在介绍进程与线程的相关内容之前,先来总结一下操作系统的相关内容:

    操作系统

    作用:

      1.隐藏复杂的硬件接口,提供良好的抽象接口

      2.管理、调度进程,使得进程对硬件的竞争变得有序

    实现方法:

      多道技术:针对单核,实现并发的执行任务。

      空间上的多道技术:多个进程共享一个内存空间,但是彼此间内存数据相互隔离

      时间上的多道技术:在进程遇到IO阻塞,或者运行时间过长的情况时,CPU会切换到其他进程执行,最终效果是CPU在不同的进程之间来回切换

      ps:在切换到其他进程时,需要保存当前进程的状态,并在切回此进程是恢复状态

    进程

      进程就是程序正在执行的过程,是程序执行过程的抽象。

      进程与程序的区别:程序只是一串保存在硬盘上的代码,而进程是程序执行的过程

    并发与并行

      并发:在单核CPU上运行任务,通过多道技术实现表面上的“同时运行”的效果,在不同的进程之间来回切换,来运行多个任务。同一时间点,CPU只在运行一个任务

      并行:只有在多核CPU上才能实现并行,每个CPU的工作方式与单核CPU的工作方式一样,也是并发执行

    进程的层次结构

    无论UNIX还是windows,进程只有一个父进程,不同的是:

    1. 在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。

    2. 在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了

    进程的状态

      进程有三种状态:

        运行、阻塞、就绪

      当一个进程运行时间过长时,操作系统会切换至其他就绪的进程执行,而此进程就会变成就绪状态;

      当进程需要执行IO操作时,进程就处于阻塞状态,操作系统会切换到其他就绪状态的进程

      

     

    进程的创建

      创建进程需要用到multiprocessing模块

    创建进程有两种方式:

    # 方式一
    import time
    from multiprocessing import Process
    
    def task(name): 
        print('%s is start' % name)
        time.sleep(2)
        print('%s is done' % name)
    
    if __name__ == "__main__":
        p1 = Process(target=task, args=(p1,))
        p2 = Process(target=task, args=(p2,))
        
        p1.start()
        p2.start()
    
        print('这是主进程打印的内容...')
    
    # 方式二
    import time
    from multiprocessing import Process
    
    class MyProcess(Process):
        def __init__(self):
            super().__init()
            self.name = name
    
        def run(self):
            print('%s is start' % self.name)
        time.sleep(2)
        print('%s is done' % self.name)
    
    if __name__ == "__main__":
        p1 = MyProcess('p1')
        p2 = MyProcess('p2')
    
        p1.start()
        p2.start()
        print('这是主线程的内容...')

    Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程

    强调:

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

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

    Process类的参数:

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

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

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

      name 为子进程的名称

    进程方法:

      p.start()    启动进程,并调用类内部的run()方法

      p.run()    执行进程指向的方法

      p.terminate()   终结进程,不进行清理工作,p下的子进程将成为僵尸进程

      p.is_alive()  查看进程是否存活

      p.join([timeout])  主进程等待p进程执行完成

    进程属性:

      p.name  进程名

      p.pid  进程pid

      p.daemon  默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

     p.join()

      主进程会等待进程p执行完成才会继续执行,多个子进程执行join方法后,主进程会同时等待多个子进程,直到最后一个子进程执行完成,主进程才会继续执行

    守护进程

      守护进程的设置就是把进程的p.daemon属性在运行之前改为True,守护进程会伴随主进程的生命周期,当主进程终止,守护进程也会跟随主进程终止;

      守护进程不可再创建出子进程

    互斥锁

      

      

      

  • 相关阅读:
    由PhysicalFileProvider构建的物理文件系统
    Net Core WebApi单元测试
    多个项目使用NET Core
    ReactNative
    定制样式插入到ueditor
    ES6的Class
    Redis存储Session
    二叉 查找树 排序树 搜索树
    SignalR实现实时日志监控
    KNN(k-nearest neighbor的缩写)又叫最近邻算法
  • 原文地址:https://www.cnblogs.com/wilbur0402/p/9603383.html
Copyright © 2020-2023  润新知