zoukankan      html  css  js  c++  java
  • 25、创建进程的两种方式、join函数、进程对象的几种属性

    一、知识储备

    并发编程中的重要概念

    串行:自上而下,顺序执行
    
    并发:在多个进程间快速的来回切着执行
    
    并行:是真正的同时运行,必须具备多核CPU,有几个核心就能并行几个任务,当任务数量超过核心数还是并发执行
    

    以上三个概念都是用于描述处理任务的方式

    阻塞:指的是程序遇到IO操作,无法继续执行代码的一种状态
    非阻塞:程序没有遇到IO操作的一个状态
    阻塞非阻塞可以用来描述执行任务的方式
    
    input()默认是一个阻塞的操作
    我们可以用一些手段将阻塞的操作变成非阻塞的操作,例如非阻塞的socket
    

    一个进程的三种状态

    阻塞:
    运行:
    就绪:
    

    进程与程序

    程序是一堆代码放在文件中,通常后缀为exe,原本是存储在硬盘上的。
    进程是将代码从硬盘读取到内存然后执行产生的
    进程是由程序产生的
    
    一个程序可以产生多个进程,例如QQ多开,每一个进程都具备一个PID,进程编号是唯一的
    

    PID和PPID

    PID是当前进程的编号
    PPID是父进程的编号
    注意:当我们运行py文件时,运行的是python解释器
    

    二、创建进程的两种方式

    • 方式一:
    from multiprocessing import Process#导入,实例化这个类,执行target
    import os
    
    #子进程
    def task():
        print('process')
        print(os.getpid())
    
    
    if __name__ == '__main__':
        # 实例化一个进程对象,并制定他要做的事,用函数来指定
        p = Process(target=task,args = (3,))  # 注意这里task不要加括号,不然直接执行了,后后面可以跟参数,只有一个的时候要,
        p.start()  # 给操作系统发送消息,让它开启进程
    
        print('父进程%s' % os.getpid())
        print('over')
    
    • 方式二:
    import os
    from multiprocessing import Process
    
    
    class Downloader(Process):
    
        # 当你想对进程高度自定义的时候,可以继承一下类
        def __init__(self, url, size, name):
            super().__init__()
            self.url = url
            self.size = size
            self.name = name
    
        def run(self):
            print(os.getpid())
            pass
    
    
    if __name__ == '__main__':
        m = Downloader()
        m.start()
        print('over', os.getpid())
    

    **三、join函数 **

    from multiprocessing import Process
    import time
    def task1(name):
        for i in range(10000):
            print("%s run" % name)
    
    def task2(name):
        for i in range(100):
            print("%s run" % name)
    
    if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
        p1 = Process(target=task1,args=("p1",))
        p1.start()  # 向操作系统发送指令
        # p1.join()   # 让主进程 等待子进程执行完毕在继续执行
    
        p2 = Process(target=task2,args=("p2",))
        p2.start()  # 向操作系统发送指令
    
        p2.join()  # 让主进程 等待子进程执行完毕在继续执行
        p1.join()
    
    
        #需要达到的效果是 必须保证两个子进程是并发执行的 并且 over一定是在所有任务执行完毕后执行
        print("over")
    

    案例

    # join的使用
    from multiprocessing import Process
    import time
    def task1(name):
        for i in range(10):
            print("%s run" % name)
    
    
    if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
    
    
        ps = []
        for i in range(10):
            p = Process(target=task1,args=(i,))
            p.start()
            ps.append(p)
    
        # 挨个join以下
        for i in ps:
            i.join()
    
        print("over")
    

    四、进程对象的几种属性

    from multiprocessing import Process
    
    
    def task():
        print('aa')
    
    
    if __name__ == '__main__':
        P = Process(target=task, name='老司机进程')
        print(P.name)  # 开了多任务的时候分辨不出来,就可以自定义名字
        # P.daemon   守护进程
        print(P.exitcode)  # 退出码 , 0表示正常退出
        # 用途:类似于错误码
        print(P.is_alive())  # 查看是否存活
        print(P.pid)  # 获取进程id
        P.terminate()  # 终止进程 与strat 相同的是不会立即终止
    
  • 相关阅读:
    nginx搭建文件服务器
    Server.MapPath("/")
    Server.MapPath("/")
    消息钩子函数入门篇
    消息钩子函数入门篇
    SQL Server 2008收缩日志文件dbcc shrinkfile参数说明
    SQL Server 2008收缩日志文件dbcc shrinkfile参数说明
    线性代数——第一章:行列式——§1.1 行列式的定义
    线性代数——第一章:行列式——§1.1 行列式的定义
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 程序目录
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/14300478.html
Copyright © 2011-2022 走看看