• python3 进程_multiprocessing模块


    '''
    多进程
    优点:可以利用多核,实现并行运算
    缺点:1、开销太大; 2、通信困难
    使用方式跟开多线程一样
    '''

    多进程
    import multiprocessing
    import time,os
    
    def foo(name):
        print('ok')
        print('name',name)
        print('parent process:',os.getppid())   # os.getppid()获取父进程号
        print('process id:',os.getpid())    # os.getpid()获取子进程号
        time.sleep(2)
    
    if __name__ == '__main__':  # 开子进程必须用这种方式
    
        foo('main process')
    
        p = multiprocessing.Process(target=foo,args=('egon',))
        p.start()
        print('ending')

    开多进程补充

    def foo():
        time.sleep(2)
        print("ok")
        #print(x)
    
    print("yuan")    # 每开启一个进程,会将主进程加载一次,也就会打印一次
    
    if __name__ == '__main__':    # 进程从这里开始
    
        p=Process(target=foo,)    # 新的进程,打印一次‘yuan’
        p.start()
    
        p1 = Process(target=foo, )
        p1.start()
    
        x=123    # Linux系统,新进程会自带主进程变量,所以自进程也可以打印x值,Windows系统不会
        p.join()
    
        print("ending")
    '''
    进程间通讯
    队列,管道,manager共享
    '''
    进程queue
    import multiprocessing
    
    def foo(q):
        q.put([11,'hello',True])
    
    if __name__ == '__main__':
    
        q = multiprocessing.Queue() # 进程队列,主函数运行创建进程队列
    
        p = multiprocessing.Process(target=foo,args=(q,))
        p.start()
    
        print(q.get())

    进程管道

    from multiprocessing import Pipe,Process
    def foo(a):
        a.send('hello world')
        print(a.recv())
    
    if __name__ == '__main__':
        a,b = Pipe()
        p = Process(target=foo,args=(a,))
        p.start()
    
        print(b.recv())
    
        b.send('hi son')

    manager数据共享

    from multiprocessing import Process,Pipe,Manager
    
    def foo(d,i):
        d[i] = i**2
    
    if __name__ == '__main__':
        manager=Manager()
        mdict = manager.dict({})
    
        l = []
        for i in range(5):
            p = Process(target=foo,args=(mdict,i))
            p.start()
            l.append(p)
    
        for i in l:
            i.join()
    
        print(mdict)



    '''
    进程池
    Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;
    但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,就重用进程池中的进程
    '''
    from multiprocessing import Pool
    import time
    
    def foo(n):
        print(n)
        time.sleep(1)
    
    if __name__ == '__main__':
    
        pool_obj = Pool(5)
    
        for i in range(100):
            pool_obj.apply_async(func=foo,args=(i,))
    
        pool_obj.close()
        pool_obj.join()
    
        print('ending')
  • 相关阅读:
    [NOIP2012] 开车旅行
    八皇后
    [Noip2014] 解方程
    [Noip2012] 国王游戏
    [JZOJ4685] 【NOIP2016提高A组8.12】礼物
    [JZOJ100043] 【NOIP2017提高A组模拟7.13】第K小数
    大整数类模板
    [BZOJ2460] [BeiJing2011]元素
    [BZOJ5299] [CQOI2018]解锁屏幕
    [JZOJ4737] 【NOIP2016提高A组模拟8.25】金色丝线将瞬间一分为二
  • 原文地址:https://www.cnblogs.com/lucaq/p/7225195.html
Copyright © 2020-2023  润新知