• 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)
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13087483.html
Copyright © 2020-2023  润新知