zoukankan      html  css  js  c++  java
  • 学习日记0905 进程与进程相关知识点

    1 开启进程的两种方式

      方式一:

    from multiprocessing import Process
    import time
    
    def task(name):
        print('%s is running' %name)
        time.sleep(3)
        print('%s is done' %name)
    
    # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
    if __name__ == '__main__':
        p=Process(target=task,args=('egon',)) #Process(target=task,kwargs={'name':'egon'})
        p.start() # 只是向操作系统发送了一个开启子进程的信号
        print('')

      方式二:

        补充:开启进程实际就是在调用Process下面的run方法

    from multiprocessing import Process
    import time
    
    class Myprocess(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s is running' %self.name)
            time.sleep(3)
            print('%s is done' %self.name)
    
    # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
    if __name__ == '__main__':
        p=Myprocess('egon')
        p.start() # 只是向操作系统发送了一个开启子进程的信号
        print('')

    join方法的使用与介绍:

        等待含有join方法(与time.sleep()相似 相当于wait)的子进程结束才会运行其他进程

    from multiprocessing import Process
    import time
    
    def task(name,n):
        print('子进程开启', name)
        time.sleep(n)
        print('子进程结束!',name)
    
    if __name__ == '__main__':
    
        p = Process(target=task,kwargs={'name':'egon','n':3})
        p.start()
        p.join()
        p2 = Process(target=task, kwargs={'name': 'beard', 'n': 1})
        p2.start()
        print('这是主进程!')

      运行结果:

    3 知识点补充:

      每个进程之间是在内存中是相互隔离的

    4 查看进程的pid

      每个进程在内中都有一个id,这个id叫pid

      获取pid有两种方式:

        方式一:

          current_process().pid

    from multiprocessing import Process,current_process
    import time
    
    def task():
        print('%s is running' %current_process().pid)
        time.sleep(30)
        print('%s is done' %current_process().pid)
    
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
        print('',current_process().pid)

          os.getpid()

    from multiprocessing import Process
    import os 
    
    def task():
        print('%s is running' %os.getpid())
        time.sleep(30)
        print('%s is done' %os.getpid())
    
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
        print('',os.getpid())

    5 僵尸进程与孤儿进程

      僵尸进程:没有被系统回收的进程,该进程会一直的占用内存空间

        孤儿进程:(在linux系统中)父进程是init的进程

    6 守护进程

      本质就是一个子进程,该进程的生命周期<=被守护的进程

      在子进程中加入p.daemon = True 注意 此代码要加在p.start()前面

    from multiprocessing import Process
    import time
    
    def task(name):
        print('老太监%s活着....' %name)
        time.sleep(3)
        print('老太监%s正常死亡....' %name)
    
    if __name__ == '__main__':
        p=Process(target=task,args=('刘清政',))
        p.daemon=True
        p.start()
        time.sleep(1)
        print('皇上:EGON正在死...')

    7 互斥锁

      互斥锁的作用是将本来并发的进程编程串行

    例如:

    import json
    import time,random
    from multiprocessing import Process,Lock
    
    def search(name):
        with open('db.json','rt',encoding='utf-8') as f:
            dic=json.load(f)
        time.sleep(1)
        print('%s 查看到余票为 %s' %(name,dic['count']))
    
    def get(name):
        with open('db.json','rt',encoding='utf-8') as f:
            dic=json.load(f)
        if dic['count'] > 0:
            dic['count'] -= 1
            time.sleep(random.randint(1,3))
            with open('db.json','wt',encoding='utf-8') as f:
                json.dump(dic,f)
                print('%s 购票成功' %name)
        else:
            print('%s 查看到没有票了' %name)
    
    def task(name,mutex):
        search(name) #并发
        mutex.acquire()
        get(name) #串行
        mutex.release()
    
        # with mutex:
        #     get(name)
    
    if __name__ == '__main__':
        mutex = Lock()
        for i in range(10):
            p=Process(target=task,args=('路人%s' %i,mutex))
            p.start()

     

  • 相关阅读:
    三级菜单的实现方式
    简单登录接口实践
    C++中的set和java的hashset有何区别?
    css 利用文档结构给列表添加样式
    谈谈我对JS中this的理解
    谈谈我对JS原型的理解
    使用node.js,实现简单的JS文件合并小工具
    谈谈我对JS闭包的理解
    谈谈我对JS作用域的理解
    模拟实现 百度翻译 右下方的可折叠的分享按钮列表
  • 原文地址:https://www.cnblogs.com/jianhaozhou/p/9592653.html
Copyright © 2011-2022 走看看