python并发编程之多线程基础知识点

    

1、操作系统

    位于硬件与应用软件之间,本质也是一种软件,由系统内核和系统接口组成

    和进程之间的关系是:

    进程只能由操作系统创建

    和普通软件区别:

    操作系统是真正的控制硬件

    应用程序实际在调用操作系统提供的接口
    主要功能:

    1. 封装了繁琐的硬件操作,为应用程序提供简单的接口

    2.将应用程序对硬件的竞争变成有序的使用

2、多道技术

   为了解决同一时间只有一个应用程序被执行问题

  实现原理:

    空间复用:同一时间在内存中存放多个应用程序

    时间复用:多个进程占用CPU同一时间片在不同的进程中相互切换, 遇到IO操作或占用CPU时间过长时,保存当前进程状态,切换到其他进程

   强调:

    多个进程之间相互独立,并是物理层面的隔离,以保证安全性  

  好处:

    同一时间可以多个应用程序在执行,实现并发,在IO操作比较多时,极大的提高效率

  弊端:

    如果没有IO操作,切换反而会降低效率

  应用程序的执行取决于IO操作,IO操作越多则效率越低

  提高效率: 减小IO操作,避免被操作系统切换

3、进程与程序

   进程:正在运行的程序,是一系列程序执行过程的总称

   程序:一段代码,程序员将自己思维逻辑按照某种编程语言规范编写下来的一堆字符串

  进程是由程序产生的,没有程序就没有进程

4、进程的三种状态

 5、PID和PPID

   import os

  os.getpid(), 当前进程id

  os.getppid(),当前进程的父进程id

6、进程的层次结构

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

    1. 在unix所有的进程,都是以init进程为根,成树形结构。

    2. 在window中,没有进程层次的概念,所有进程的地位相同,在创建进程时,父进程会得到一个特殊令牌(句柄),

       该句柄可以控制子进程,但父进程可以把该句柄传给其他子进程。

7、python中实现多进程

  7.1 实现的两种方式

     方式1:实例化Process类
    from multiprocessing import Process
    def task(name):
      print(name)
    if __name__ == '__main__':
      p = Process(target=task, args=('sun',))
      p.start()
      print("主")
  方式2:继承Process类
    from multiprocessing import Process
    class MyProcess(Process):
      def __init__(self, name):
        super(MyProcess, self).__init__()
        self.name = name
      def run(self):
        print(self.name)
    if __name__ == '__main__':
      p = MyProcess('sun')
      p.start()
   特别注意:
    1. 在windows下,开启子进程必须在__main__下面,但在Linux环境下就不用, 原因:
      windows开启子进程与linux开启子进程方式不同, Linux,直接将主进程的内存中,完整的copy子进程到自己的空间然后执行。
      windows,如果没有__main__函数,子进程会在运行时拷贝当前主进程中的所有内容,
       这也就意味着当一个新的子进程被创建的时候,该子进程就会复制当前模块,其中也包括这两句:p = MyProcess('sun'), p.start()。
      很显然,这样写法可能形成无限递归式的创建子进程,所以为了避免以上情况,引入if __name__ == '__main__':,
    2. 第二种方式,必须将执行的代码放到run方法中。

  7.2 进程之间的内存相互隔离

    from multiprocessing import Process
    import time
    x=1000
    def task():
      time.sleep(3)
      global x
      x=0
      print('子进程',x)
    if __name__ == '__main__':
      print('main', x)
      p=Process(target=task)
      p.start()
      p.join() # 让父亲在原地等
      print(x)

    输出结果:

     main 1000
       子进程 0
     1000

  7.3 进程的方法和属性

    start(),向操作系统发送一个开子进程信号
    join(),使主进程等待子进程执行完毕后才会执行,本质是内部修改子进程优先级高于主进程
    terminate(), 向操作系统发送一个终止子进程信号,发完之后继续执行
    is_alive(), 获取进程的存活状态
   
    p.name, 在创建时可以给进程取名字
    p.exitcode, 获取进程的退出码  只有进程完全结束后才能获取到
    p.pid # 获取进程的pid

猜你喜欢

转载自www.cnblogs.com/ywsun/p/10478710.html