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,守护进程会伴随主进程的生命周期,当主进程终止,守护进程也会跟随主进程终止;

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

互斥锁

  

  

  

原文地址:https://www.cnblogs.com/wilbur0402/p/9603383.html