第二十六天

今日内容

一、进程

1.1父进程与子进程

  什么是父子进程:当前运行的程序内再运行了另一个程序,那么后面开启的进程称之为当前进程的子进程,当前进程称之为后面开启进程的父进程
  from multiprocessing import Process
  import os
  import time
  def task(n):
      print("父进程:%s 自己:%s 正在运行" %(os.getppid(),os.getpid()))
      time.sleep(3)
      print("父进程:%s 自己:%s 正在运行" %(os.getppid(),os.getpid()))

  if __name__ == "__main__":
      p = Process(target=task,args=(3,))
      p.start()
      print("主",os.getpid())

1.2僵尸进程

  什么是僵尸进程:在每个子进程正常结束后操作系统会回收子进程的重型资源,但会保留一些子进程的信息,比如pid等,这时的子进程称之为僵尸进程
  解决僵尸进程方式:首先少量的僵尸进程不会影响程序的运行,只有不断增加而且一直不回收的僵尸进程才会导致程序因为没有pid号而运行不了
  解决方式:基于解释器的封装机制,在父进程正常结束运行后会自动检测产生的僵尸进程并清空回收,所以并不需要自己手动清除

1.3孤儿进程

  什么是孤儿进程:在子进程还在运行时父进程已经结束了,这时的子进程称之为孤儿进程
      孤儿进程释放的两种方式:
            1、在父进程正常结束后会等子进程运行结束后释放孤儿进程的资源
            2、在杀死父进程时孤儿进程会被pid号为1的init进程接管,init进程会检测孤儿进程的状态,当孤儿进程运行完毕后会进行释放子进程资源

1.4守护进程

  守护进程
  什么时守护进程:当父进程结束后无论子进程处在什么状态都会跟着一起结束,这时子进程称之为父进程的守护进程
  运用场景:用于父进程结束后子进程的存在已经没有了意义,所以会一起结束
  代码演示:
  from multiprocessing import Process
  import time
  import random

  class Piao(Process):            #这时子进程为主进程的守护进程,在主进程结束后子进程内代码不会在运行了
      def __init__(self,name):
          self.name=name
          super().__init__()
      def run(self):
          print('%s is piaoing' %self.name)
          time.sleep(random.randrange(1,3))
          print('%s is piao end' %self.name)


  p=Piao('egon')
  p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
  p.start()
  print('主')

1.5互斥锁

  什么是互斥锁:当多个进程共享同一文件时,如果都能同时修改的话会造成数据的混乱,所以这时需要控制修改文件的顺序
  在进程需要修改文件时设置一把锁,当哪个进程抢到这把锁时才能进行文件的修改,当进程把这把锁释放掉时后面的进程才能开始抢这把锁,有锁才能对文件进行修改
  以抢票举例:
  文件db的内容为:{"count":1}
  注意一定要用双引号,不然json无法识别
  #没有加锁时,只有一张票,每个用户都可以抢票成功
  from multiprocessing import Process,Lock
  import time,json,random
  def search():
      dic=json.load(open('db.txt'))
      print('33[43m剩余票数%s33[0m' %dic['count'])

  def get():
      dic=json.load(open('db.txt'))
      time.sleep(0.1) #模拟读数据的网络延迟
      if dic['count'] >0:
          dic['count']-=1
          time.sleep(0.2) #模拟写数据的网络延迟
          json.dump(dic,open('db.txt','w'))
          print('33[43m购票成功33[0m')

  def task(lock):
      search()
      get()
  if __name__ == '__main__':
      lock=Lock()
      for i in range(5): #模拟并发5个客户端抢票
          p=Process(target=task,args=(lock,))
          p.start()

  #加了锁时,这时所有用户都可以看到票的数量,但是只有抢到了锁的用户才能先抢到票
  from multiprocessing import Process,Lock
  import time,json,random
  def search():
      dic=json.load(open('db.txt'))
      print('33[43m剩余票数%s33[0m' %dic['count'])

  def get():
      dic=json.load(open('db.txt'))
      time.sleep(0.1) #模拟读数据的网络延迟
      if dic['count'] >0:
          dic['count']-=1
          time.sleep(0.2) #模拟写数据的网络延迟
          json.dump(dic,open('db.txt','w'))
          print('33[43m购票成功33[0m')

  def task(lock):
      search()
      lock.acquire()
      get()
      lock.release()
  if __name__ == '__main__':
      lock=Lock()
      for i in range(5): #模拟并发5个客户端抢票
          p=Process(target=task,args=(lock,))
          p.start()
原文地址:https://www.cnblogs.com/kk942260238/p/14304645.html