• day32 进程


    上午:

    # 1 开启子进程
        #target
        #args
        # if __name__ == '__main__'
        #start()
    # 2.其它的方法:
        #方法:
            #terminate()
            #is_alive()
        #属性
            #pid
            #name
    # 3. 开启多个子进程
    # 4.join
        #阻塞等待一个子进程结束
        #阻塞等待多个子进程结束
    #5. 守护进程
    
    #6.面向对象的方式实现多进程

    1内容回顾

    #__author : 'liuyang'
    #date : 2019/4/15 0015 上午 9:12
    # io输入   :输入到内存
    #     输出 : 从内存中输出到硬盘
    
    # 操作系统
        #单道
        #多道
        #分时
    #并发和并行
        #多个程序在一个cpu上交替 运行
        #在多个cpu上多个程序   #快
    
    # 阻塞和非阻塞
        #在工作 :非阻塞
    
    # 同步和异步
        #调用一个程序,需要等待这个任务执行完后并返回结果,现在的代码才能运行
        #掉一个任务,不关系这个任务是否完成,只负责调用,余下的内容
    
    # 进程和程序
        # 正在执行的程序
        #统进行资源分配和调度的基本单位
        #多个进程之间的数据相互隔离
        # pid唯一标识 可变 另次运行
    
    
    
    #进程的创建 和结束
        #系统初始化
        # 子进程
        #交互式请求
        # 结束:   正常退出
                 # 出错退出:自愿(自己设计的)
                 #严重错误:
                #杀死了一个子进程
    
    # 进程的调度
        #先来先服务
        #短作业优先
        #分时/多道(遇到IO把cpu让出来)
        #多级反馈队列
            # 先  短  分  都有  尤其是短,因为短作业第一优先就执行
            # 第一级   时间短  执行不完的被下放
            #但是 下面的优先级低  执行时间长       #比较合理
    
        # 阻塞 是 干别的事吗?
    
    # 登录
    # input()
    # input()
    # 判断用户名密码  # 不在第一优先级了 因为被阻塞 占了
    import sys
    print(sys.argv)
    if sys.argv[1] == 'aa' and sys.argv[2] =='aaa':
        print('登陆成功')
    #  把放在一个列表中  类似于 *args
    #  启动的同时  把用户名和密码放进去
    View Code

    2.今日内容

    # 使用模块
    # multiprocessing  一个多元化的进程模块
    # multiple 多元化 processing  进程
        #涵盖了和进程相关的几乎    所有的内容
    #process 类  帮助你启动停止进程
    # Lock 类  锁
    # Queue  类
    View Code

    3.process类的使用

    #__author : 'liuyang' 
    #date : 2019/4/15 0015 上午 10:12
    import time
    import os
    # def func(i):
    #     time.sleep(1)
    #     print(i,os.getpid())
    # print('主:',os.getpid())
    #
    # func(0)
    # func(1)
    # func(2)
    # #  同步  执行完 0  再1  再 2
    # 2 .使用process 穿件一个类
    '''
    from multiprocessing import Process  # 包 #类包 大写
    def func( ):
        time.sleep(1)
        print(0,os.getpid(),os.getppid())# pid processid  ppid:parent process id
    
    # Processs 进程类
    if __name__ == '__main__':      #多进程 是因为这里 多个操作一个文件
                                # windows 操作系统下开启子进程,子进程中的代码是通过import 这种方式被导入到子进程中的
                                # 要想不一直 循环父创子  子创子  都放到if 判断里
                                # mac,linux 是 copy到这来的  不需要if  
        Process(target=func).start()
        Process(target=func).start()
        Process(target=func).start()
    
        #异步  不影响别的执行
        # func的参数怎么传递
        # func 不能 + 括号  加括号立刻执行 print(func())
    '''
    # 怎么证明是多个进程
    
    # 几个概念
        #子进程    #互不干扰
        #父进程
        #主进程  :run的是主 同时也是父进程
    
    # if __name__ = '__mian__'  #和进程原本没有关系
    '''
    def func(a,b,c):
        time.sleep(1)
        print(a,b,c,os.getpid())
    
    print('主:',os.getpid())
    
    # 传参    #还没开启进程(没隔离)中就已经加入 所以可以传参
    from multiprocessing import Process  # 包 #类包 大写
    if __name__ == '__main__':
        Process(target=func,args=(1,2,3)).start()
    
    # 1、func的返回值能返回到父进程中么? 不行  进程开启后隔离了
        #进程之间数据隔离,所以子进程中的返回值父进程获取不到
    
    # 异步的现象
    # Process 进程类
    if __name__ == '__main__':
        p = Process(target=func,args=(1,2,3))
        p.start()      #p是一个进程操作符
    
            #操作系统有空的时候开始
        print(p.is_alive())
        p.terminate() #终止结束一个进程
            # 异步非阻塞模型   各干各的 不等待 干完了就干
            # 操作系统有空的时候结束
        print(p.is_alive())
        time.sleep(0.1)
        print(p.is_alive())
        print(p.name,p.pid) #Process-2 8488 #名字随机分布的
    
    if __name__ == '__main__':
        for i in range(1,4):
            Process(target=func, args=(i,i+1,i+2)).start()
    
    # 2. process类
    # 3.进程中的其它方法
    # 4.如何开启多个子进程
    from multiprocessing import Process
    import random
    def send_mail(name):
    
        time.sleep(random.uniform(1,3))
        print('已经给%s发送邮件完毕'%name)
    if __name__ =='__main__':
        lst = ['liu','wang','zhang']
        # 阻塞等在 子进程结束之后
        p_l = []
        for name in lst :
            p = Process(target=send_mail , args=(name,)) #必须元组
            p.start()   #异步非阻塞  #发信息需要时间
            # 这样缩进同步了
            #p.join()    #这样阻塞,直到p对应的进程结束之后才结束阻塞
    
        #这个思路以后会经常的用到在以后
                #现在不着急用, 都执行完了 每个都用 先加入 列表中
            p_l.append(p)
    
        for p in p_l : p.join() # 执行完了没有 ,每一个进程分别join
        print('所有的信息发送完毕了') #然后这里就抽空执行了
    
    # '''
    # 所有的信息发送完毕了
    # 已经给wang发送邮件完毕
    # 已经给liu发送邮件完毕
    # 已经给zhang发送邮件完毕'''
    # 同时发  并发  效率
    # '''
    #守护进程       #主进程结束 守护进程也结束  然后子进程结束
    import time
    from multiprocessing import Process
    def func():
        # while True:
        for i in range(20):
            time.sleep(0.5)
            print('in func')
    def func2():
        print('start: func2')
        time.sleep(5)
        print('end: func2')
    
    if __name__ == '__main__':
        p = Process(target=func)
    
        p.daemon = True     #表示设置p为一个守护进程
        p.start()               #结束主代码,结束  不管子进程
        p2 = Process(target=func2)
        p2.start()
        print('in main')
        time.sleep(3)
        print('finished')
        # p2.join()           # 这样可以 子进程 。阻塞在这  可以等到子进程也结束
    
    # name 里的  func()里的
    # 主进程 和 子进程互不干扰
    # 主进程执行完毕之后 , 会等到所有子进程结束之后
    # 为什么
        # 父进程要负责回收子进程的 系统资源  防止一直占用
    
    #守护进程:
        #是一个子进程,守护的是主进程
        #结束条件:主进程的代码结束,(主进程结束,代码还没结束,等待着子进程收尸),守护进程也结束
        #  因为守护进程也是子进程(要被主进程回收),所以没法守护到主进程完全结束
    
    # 进程
        #主进程的代码结束,守护进程结束
        #主进程要挥手进程(子进程)的资源
        #等待其他所有子进程结束
        #主进程回收所有子进程的资源
    
    # 迭代器生成器(把变量删掉,是内存中的资源,不操作系统)  内存中的数据 资源 都不需要回收  垃圾回收机制
            #内存中的这个变量  join   自己程序的级别里
            #操作系统 程序里 不能删掉这个变量
    # 但是操作系统的资源的  进程
            #需要主进程来回收
    View Code

    4  和 5 的 __name__

    #__author : 'liuyang' 
    #date : 2019/4/15 0015 上午 10:43
    import name_demo
    # print()
    # 'name_demo': <module 'name_demo' from 'D:\Python\S20\day32\name_demo.py'>
    #
    4__name__
    #__author : 'liuyang'
    #date : 2019/4/15 0015 上午 10:41
    # print(__file__)  #内置文件中的变量
    # print(__all__) # 列表里写啥 ,就可以显示啥
    
    print([__name__])   #['__main__']
    
    
    # 看当前这句话是怎么被执行的
        #1. 右键直接执行      [__name__] = ['__main__']
        #2. 导入这个模块执行  [__name__]= ['name_demo']
        # 变量    sys.modules[__name__] 太棒了 联系
    import sys
    print(sys.modules)
    # sys.modules[__name__]
    #<module '__main__' from 'D:/Python/S20/day32/name_demo.py'>,
        #用name  找到文件了
        #执行的任意一个文件  name 都是 __main__
        #但是被别人导入了  name 就变成了导入的文件的名字了
    
    def func():
        print('in func')
    
    if __name__ == '__main__':
        func()  #写的所有代码是不希望这个文件作为模块被导入的时候执行的代码
    5 name_demo

    6.  面向对象的多线程

    #__author : 'liuyang' 
    #date : 2019/4/15 0015 下午 12:23
    # 1 开启子进程
        #target
        #args
        # if __name__ == '__main__'
        #start()
    # 2.其它的方法:
        #方法:
            #terminate()
            #is_alive()
        #属性
            #pid
            #name
    # 3. 开启多个子进程
    # 4.join
        #阻塞等待一个子进程结束
        #阻塞等待多个子进程结束
    #5. 守护进程
    
    #6.面向对象的方式实现多进程
    import os
    from multiprocessing import Process
    class MyProcess(Process):
        def __init__(self,a,b):
            super().__init__()
            self.a = a
            self.b = b
        def run(self):          #希望在子进程中执行的代码就放到run方法中
            print(os.getpid(),self.a ,self.b)      #在这里写
    
        # def start(self):  # 希望在子进程中执行的代码就放到run方法中
        #     print(os.getpid(), self.a, self.b)  # 在这里写
    
    
                # def start(self):          #希望在子进程中执行的代码就放到run方法中
            # print(os.getpid())      #在这里写
    
    if __name__ == '__main__':
        # for i in range(10):
            MyProcess(1,2).start()  #通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1,2).start()#通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1,2).start()#通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
            MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
    
    # 明天默写
        #0.内容回顾的概念
        #1.使用multiprocess 起一个最简单的进程,执行查看子进程的进程id
        #2.使用多进程实现socket tcp协议的并发server端
            #博客上有答案
    
        # 敏捷编程  每一天都有一个任务  迅速提升 ,就像下象棋
        # 不断的推翻自己的代码  数据结构什么的
    process类的总结
  • 相关阅读:
    .NET : 单元测试到底给我们带来什么
    .NET : 如何将16进制颜色代码转换为十进制
    LINQ : 谈谈LINQ TO SQL中的直接加载和延迟加载
    .NET : 单元测试的几个Attribute介绍
    .NET : 在单元测试中使用外部文件作为数据源
    再来谈谈json
    .NET : 关于图片格式的问题
    VSTS : 比较性能基准
    .NET : 如何将大文件写入到数据库中
    LINQ : 如何在JOIN或者GROUP BY的时候使用复合键
  • 原文地址:https://www.cnblogs.com/Doner/p/10710035.html
Copyright © 2020-2023  润新知