zoukankan      html  css  js  c++  java
  • day 32 管道.数据共享.回调函数与进程池

    一 . 管道

      Pipe   Conn1 ,conn2 = Pipe ( )

    二 . 数据共享

      M = Manager ( )

      Dic = m.dict({'name' : sbalex})

      多个管道会导致数据安全的问题,会使数据丢失,我们就进行加锁Lock

    三 . 回调函数

      callback = call_back_func

      

    import time
    from multiprocessing import Pool,Process

    import os

    def func(n):
    # print('xxxxxxxxxx')
    print('子进程的pid',os.getpid())
    return n*n,'约吗'

    def call_back_func(x):
    # print(x) #(9, '约吗')
    print('call_back',os.getpid())
    print(x[0])

    if __name__ == '__main__':
    pool = Pool(4)
    pool.apply_async(func,args=(3,),callback=call_back_func)

    # print('主进程的pid',os.getpid())
    # pool.close()
    # pool.join()
    # time.sleep(1)

    四 . 进程池(今天的重点)

      Pool 是进程池模块

      Map : 异步提交任务,参数

      

    import time          
    from multiprocessing import Process,Pool

    def func(i):
    num = 0
    for j in range(5):
    num += i

    if __name__ == '__main__':
    pool = Pool(4)
    p_list = []
    start_time = time.time()
    for i in range(100):
    p = Process(target=func,args = (i,))
    p_list.append(p)
    p.start()
    [pp.join() for pp in p_list]
    end_time = time.time()
    print(end_time -start_time)

    s_time = time.time()
    pool.map(func,range(100)) # map自带join+close
    e_time = time.time()
    print(e_time - s_time)
      
      
      

      进程池同步方法,Apply :同步提交任务,直接可以收到返回值

      

    import time
    from multiprocessing import Process,Pool

    def func(i):
    num = 0
    for j in range(5):
    num += i
    time.sleep(1)
    print(num)
    return num

    if __name__ == '__main__':
    pool = Pool(4)

    for i in range(10):
    res = pool.apply(func,args=(i,)) # 同步串行
    # 第一个位置func,第二个位置传参,无敌传参, 任何参数都可以传
    print(res)
      
     

      进程池异步方法,Apply_async()  异步提交任务:res.get()  阻塞效果,Close join
      
      
    import time
    from multiprocessing import Process,Pool

    def func(i):
    num = 0
    for j in range(5):
    num += i
    time.sleep(1)
    # print(">>>",num)
    return num
    if __name__ == '__main__':
    pool = Pool(4)

    red_list = []
    for i in range(10):
    res = pool.apply_async(func,args=(i,))
    # print(res)
    red_list.append(res)
    # print(res.get())

    pool.close() # 不是关闭进程池,只是锁定
    pool.join() #等待进程池中所有任务执行完,但是无法确认是否所有的任务真的全部执行完了,前面要加close方法
    for resss in red_list:
    print(resss.get())
     
  • 相关阅读:
    Poj 2017 Speed Limit(水题)
    Poj 1316 Self Numbers(水题)
    Poj 1017 Packets(贪心策略)
    Poj 1017 Packets(贪心策略)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2000 Gold Coins(水题)
    poj 2000 Gold Coins(水题)
  • 原文地址:https://www.cnblogs.com/liuteacher/p/10038638.html
Copyright © 2011-2022 走看看