zoukankan      html  css  js  c++  java
  • 第二十六天

    今日内容

    一、进程

    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()
  • 相关阅读:
    【git】之常用命令
    VueJs
    如何做技术选型
    用户登录验证注意事项
    npm xss
    express-session
    ejs、jade和dust
    XMLHttpRequest.responseType
    JS对象字面量
    安装Angulr CLI
  • 原文地址:https://www.cnblogs.com/kk942260238/p/14304645.html
Copyright © 2011-2022 走看看