• Python-Basis-19th


    周四,晴,记录生活分享点滴

    参考博客1:https://www.cnblogs.com/yuanchenqi/articles/5745958.html

    参考博客2:https://www.cnblogs.com/alex3714/articles/5230609.html

    Python版本:3.5

    创建多进程

    多进程实现并发,全部CPU同时工作

    多线程实现假并发,只有一个CPU工作,因为速度太快,先后顺序无法分辨

    直接调用

    from multiprocessing import Process
    import time
    
    def f(name):
        time.sleep(1)
        print('hello', name,time.ctime())
    
    if __name__ == '__main__':
        p_list=[]
        for i in range(3):
            p = Process(target=f, args=('alvin',))  # 创建进程对象
            p_list.append(p)
            p.start()
        for p in p_list:
            p.join()
            
        print('end')

    类式调用

    from multiprocessing import Process
    import time
    
    class MyProcess(Process):
        def __init__(self):  # 1.1更换进程名需要在self后加一个参数name
            super(MyProcess, self).__init__()
            #self.name = name # 1.2name重新赋值
    
        def run(self):
            time.sleep(1)
            print ('hello', self.name,time.ctime())
    
    
    if __name__ == '__main__':
        p_list=[]
        for i in range(3):
            p = MyProcess()  # 1.3创建进程对象中里面需要加参数,例如chung,三个进程的名字都是chung,如果是每个进程有自己单独的名字,需要分开创建
            p.start()
            p_list.append(p)
    
        for p in p_list:
            p.join()
    
        print('end')

    进程关系

    父进程与子进程之间的关系

    from multiprocessing import Process
    import os
    import time
    
    # 主进程 -----------------------
    def info(title):
        print(title)
        print('module name:', __name__)  # __name__是__main__,打印__main__
        print('parent process:', os.getppid())  # 父进程号,用pycharm时,父进程是pycharm。每一个进程都有一个父进程
        print('process id:', os.getpid())  # 本进程号
    
    
    def f(name):
        info('33[31;1mfunction f33[0m')
        print('hello', name)
        
    # 子进程 -----------------------
    if __name__ == '__main__':  # Windows必须加,linux不用加
        info('33[32;1mmain process line33[0m')
        time.sleep(3)
        p = Process(target=info, args=('bob',))
        p.start()
        p.join()

     

    Process类

    构造方法

    Process([group [, target [, name [, args [, kwargs]]]]])

    • group: 线程组,目前还没有实现,库引用中提示必须是None
    • target: 要执行的方法
    • name: 进程名
    • args/kwargs: 要传入方法的参数

    实例方法

    • is_alive():返回进程是否在运行
    • join([timeout]):阻塞当前上下文环境的进程,直到调用此方法的进程终止或到达指定的timeout(可选参数)
    • start():进程准备就绪,等待CPU调度
    • run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法
    • terminate():不管任务是否完成,立即停止工作进程

    属性

    • authkey
    • daemon:和线程的setDeamon功能一样
    • exitcode(进程在运行时为None、如果为–N,表示被信号N结束)
    • name:进程名字
    • pid:进程号
    import time
    from  multiprocessing import Process
    
    def foo(i):
        time.sleep(1)
        print (p.is_alive(),i,p.pid)
        time.sleep(1)
    
    if __name__ == '__main__':
        p_list=[]
        for i in range(10):
            p = Process(target=foo, args=(i,))
            #p.daemon=True
            p_list.append(p)
    
        for p in p_list:
            p.start()
        # for p in p_list:
        #     p.join()
    
        print('main process end')

    进程队列

    Queues(重要)

    主进程与子进程进行通信

    进程间的数据不能共享,是完全独立的

    from multiprocessing import Process, Queue
    
    def f(q,n):
        q.put([42, n, 'hello'])
    
    if __name__ == '__main__':
        q = Queue()  # 创建进程队列
        p_list=[]
        for i in range(3):
            p = Process(target=f, args=(q,i))  # 将q作为参数传入
            p_list.append(p)
            p.start()
        print(q.get())
        print(q.get())
        print(q.get())
        for i in p_list:
                i.join()

    Pipes(不常用)

    主进程与子进程进行通信

    from multiprocessing import Process, Pipe
     
    def f(conn):
        conn.send([42, None, 'hello'])  # 可以传字符,socket传字节
        conn.close()
     
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()
        p = Process(target=f, args=(child_conn,))
        p.start()
        print(parent_conn.recv())   # prints "[42, None, 'hello']"
        p.join()

    Managers

    数据共享

    from multiprocessing import Process, Manager
    
    def f(d, l, n):
        d[n] = '1'  # d指字典,manager创建的,可以在进程中实现共享
        d['2'] = 2
        d[0.25] = None
        l.append(n)  # n指0-9
        print(l)
    
    if __name__ == '__main__':
        with Manager() as manager:  # with open() as f 等于 f=open(),所以manager = Manager()
            d = manager.dict()
    
            l = manager.list(range(5))
            p_list = []
            for i in range(10):
                p = Process(target=f, args=(d, l,i))
                p.start()
                p_list.append(p)
            for res in p_list:
                res.join()
    
            print(d)
            print(l)
  • 相关阅读:
    [SQL Server]分页功能的实现
    [Others]每个文件夹都具有的特殊文件夹
    [ASP.NET]使页面的大小适合打印尺寸
    [SQL Server]树形结构的创建
    [ASP.NET]获取用户控件对象的引用
    [SQL Server]关于15517号错误的一点想法
    [SQL Server]创建自定义聚合函数值得注意的问题
    Java开源BI商业智能工具
    电子商务网站搜索架构方案
    产品经理如何培养对市场的敏感度和洞察力?
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13087483.html
Copyright © 2020-2023  润新知