zoukankan      html  css  js  c++  java
  • 计算机发展史 进程

    多道技术

    1.空间上的复用: 多个程序共用一套计算机硬件

    2.时间上的复用: 切换+保存状态

      1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)

      2.当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)

      并发:看起来像同时运行的就可以
           并行:真正意义上的同时执行
                单核的计算机能不能实现并行,但是可以实现并发

    同步异步:表示的是任务的提交方式
            同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的表现就是卡住了)
            异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的  但是是用过其他方式获取)

    阻塞非阻塞:表示的程序的运行状态
            阻塞:阻塞态
            非阻塞:就绪态 运行态

    创建进程的两种方式

    # 创建进程会将代码以模块的方式从上往下执行一遍
    方式一
    from multiprocessing import Process
    import time
    def test(name):
        print('%s'%name)
        time.sleep(1)
        print('hi')
    if __name__ == '__main__':  #在创建进程时,在if __name__ == '__main__':内创建
        p = Process(target=test,args=('egon',))  #创建一个进程对象,括号内第一个是函数名,第二个是传入的参数,且是元组
        p.start()  #告诉操作系统,要创建一个进程
        time.sleep(1)
        print('hello')
    方式二
    from multiprocessing import Process
    import time
    class MyClass(Process):
        def __init__(self,name):
            super().__init__()
            self.name = name
        def run(self):
            print('%s'%self.name)
            time.sleep(1)
            print('hi')
    if __name__ == '__main__':
        p = MyClass('egon')
        p.start()
        print('gun')

    join方法是先执行完子程序之后. 在执行主程序

    from multiprocessing import Process
    import time
    def test(name,i):
        time.sleep(i)
        print('hello')
    if __name__ == '__main__':
    
        # p_list = []
        # for i in range(3):
        #     p = Process(target=test,args=('进程',i))
        #     p.start()
        #     p_list.append(p)
        # for p in p_list:
        #     p.join()
        # print('gun')
    
        p = Process(target=test,args=('egon',1))
        p1 = Process(target=test,args=('jason',2))
        start_time = time.time()
        p.start()
        p1.start()
        p.join()
        p1.join()
        print('hi')
        print(time.time()-start_time)

    进程对象的其他方法

    from multiprocessing import Process,current_process
    import os
    import time
    def test(name):
        print('%s'%name,current_process().pid,'子进程%s'%os.getpid(),'父进程%s'%os.getppid())
        time.sleep(2)
        print('hello')
    if __name__ == '__main__':
        p = Process(target=test,args=('egon',))
        p.start()
        time.sleep(1)
        p.terminate()  # 杀死当前进程,本质是让操作系统帮你去杀死一个进程
        time.sleep(1)
        print(p.is_alive())  # 判断进程是否存活
        print('gun')

    僵尸进程与孤儿进程
        
    父进程回收子进程资源的两种方式
           1.join方法
           2.父进程正常死亡
     所有的进程都会步入僵尸进程
                  
      孤儿进程
            子进程没死 父进程意外死亡           
              针对linux会有儿童福利院(init) 如果父进程意外死亡他所创建的子进程都会被福利院收养

    守护进程

    from multiprocessing import Process
    import time
    def test(name):
        print('%s'%name)
        time.sleep(1)
        print('%s'%name)
    if __name__ == '__main__':
        p = Process(target=test,args=('egon',))
        p.daemon = True   # 将该进程设置为守护进程
        p.start()
        time.sleep(1)
        print('bye')

    互斥锁
            当多个进程操作同一份数据的时候 会造成数据的错乱
            这个时候必须加锁处理
                将并发变成串行
                    虽然降低了效率但是提高了数据的安全
                注意:
                    1.锁不要轻易使用 容易造成死锁现象
                    2.只在处理数据的部分加锁 不要在全局加锁
            
            锁必须在主进程中产生 交给子进程去使用

    from multiprocessing import Process,Lock
    import time
    import json
    def search(i):
        with open('data','r',encoding='utf-8')as f:
            data = f.read()
        t_d = json.loads(data)
        print('用户%s查询余票%s'%(i,t_d.get('ticket')))
    def buy(i):
        with open('data','r',encoding='utf-8')as f:
            data = f.read()
        t_d = json.loads(data)
        time.sleep(1)
        if t_d.get('ticket') > 0:
            t_d['ticket'] -= 1
            with open('data','w',encoding='utf-8')as f:
                json.dump(t_d,f)
            print('抢票成功')
        else:
            print('没票了')
    def run(i,mutex):
        search(i)
        mutex.acquire()  # 抢锁
        buy(i)
        mutex.release()  #释放锁
    if __name__ == '__main__':
        mutex = Lock()   #生成一把锁
        for i in range(10):
            p = Process(target=run,args=(i,mutex))
            p.start()
    
    data文本文档
    {"ticket": 0}
    dayehui
  • 相关阅读:
    锦哥同济大学2021年数学分析高等代数考研试题参考解答
    上海交通大学2021年数学分析高等代数考研试题参考解答
    锦哥山东大学2021年数学分析考研试题
    锦哥南京大学2021年高等代数考研试题
    锦哥南京大学2021年数学分析考研试题
    锦哥华中师范大学2021年高等代数考研试题
    裴礼文数学分析中的典型问题与方法第3版1.1.3笔记Wallis公式
    锦哥中南大学2021年高等代数考研试题
    锦哥中南大学2021年数学分析考研试题
    裴礼文数学分析中的典型问题与方法第3版1.1.2几个常用的不等式
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11329407.html
Copyright © 2011-2022 走看看