zoukankan      html  css  js  c++  java
  • 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,守护进程会伴随主进程的生命周期,当主进程终止,守护进程也会跟随主进程终止;

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

    互斥锁

      

      

      

  • 相关阅读:
    【POJ 1958】 Strange Towers of Hanoi
    【HNOI 2003】 激光炸弹
    【POJ 3263】 Tallest Cow
    【POJ 2689】 Prime Distance
    【POJ 2777】 Count Color
    【POJ 1995】 Raising Modulo Numbers
    【POJ 1845】 Sumdiv
    6月16日省中集训题解
    【TJOI 2018】数学计算
    【POJ 1275】 Cashier Employment
  • 原文地址:https://www.cnblogs.com/wilbur0402/p/9603383.html
Copyright © 2011-2022 走看看