day33

并发编程

#udp不可靠的原因,当数据一旦发送到网络中后,会立即删除缓存中的数据
#tcp可靠的原因, 发送数据以后,会等待对方确认,如果没有确认信息,数据就会一直存在于缓存中,知道对方确认或者超时
#进程:一个正在被运行的程序称为进程,程序的执行过程,进程是一个抽象概念
    # 进程源于操作系统

'''
多进程
  阻塞:程序进入了I/O操作,就进入了阻塞状态
  非阻塞:程序正常的运行,没有晕倒任何I/O操作
  阻塞.非阻塞指的是程序的运行状态

  并发:多个任务同时发生,但同一个时刻只有一个任务在执行(本质上是切换执行,速度非常快)
  并行:多个任务同时执行,必须具备多个处理CPU,
  并发,并行指的程序的执行/处理 方式


  程序的三种状态:
      运行,就绪,阻塞
      时间片用完了之后会转为就绪态

  Linux 和 Windows 开启进程的区别
  Linux: 需要拷贝一份数据给子进程 ,linux会将数据完全拷贝给子进程
  Windows: 需要拷贝一份数据子进程,windows只会一部分数据拷贝给子进程,同时会导入py文件来执行.这样一来会递归开进程

  内存之间相互隔离

  当你开启了一个子进程,并且给他一个任务,如果你希望知道这个任务的什么是完成,就需要等待

  join:提高优先级,是的父进程需要等待子进程结束

  孤儿进程:父进程先结束了,而子进程还运行着
  孤儿进程有存在必要性,对操作系统无害
  孤儿进程会被操作系统接管

  僵尸进程:子进程已经结束了,但是操作系统会保留一些基本信息,比如pid
  僵尸进程如果太多会占用大量的系统资源,导致系统无法开启新的进程

  Linux中有一种机制:wait/waitpid用于父进程回收子进程的资源
  python会自动回收僵尸进程

开启子进程的两种方式

from multiprocessing import Process
import os
import time

def task():
   print('买烟去')
   print(time.sleep(3))
   print(os.getpid())

if __name__ == '__main__':
   print('执行2')
   p = Process(target=task)
   p.start()#开启子进程

   p.terminate()#结束子进程
   print('执行4')
print('执行1')
import os
from multiprocessing import  Process
class MyProcess(Process):
   def __init__(self,name):
       super().__init__()
       self.name = name
# 继承Procee覆盖run方法将要执行任务发到run中
   def run(self):
       print(self.name)
       print("子进程 %s running!" % os.getpid())
       print("子进程 %s over!" % os.getpid())
       
if __name__ == '__main__':
# 创建时 不用再指定target参数了
p = MyProcess("rose")
p.start()
print("父进程over!")
原文地址:https://www.cnblogs.com/zhuqihui/p/10957618.html