zoukankan      html  css  js  c++  java
  • 进程同步Lock,进程池Pool

    import multiprocessing, time, os
    '''
    进程同步Lock:
    对于所有在 threading 存在的同步原语,multiprocessing 中都有类似的等价物。例如,可以使用锁来确保一次只有一个进程打印到标准输出;不使用锁的情况下,来自于多进程的输出很容易产生混淆
    '''
    # def foo(l, i):
    #  l.acquire()
    #  print('hello world %s' % i)
    #  l.release()
    #
    # if __name__ == '__main__':
    #  l = multiprocessing.Lock() # 也是Lock锁
    #  l1 = []
    #  for i in range(10):
    #     p = multiprocessing.Process(target=foo, args=(l, i,))
    #     p.start()
    #     l1.append(p)
    #  for t in l1:
    #     t.join()
    
    
    '''
    进程池Pool:
    内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止。
    '''
    def foo(n):
       time.sleep(1)
       print(n)
       return 'foo %s' % n
    
    def bar(m):
       '''bar函数为回调函数,那么foo的返回值会作为参数传给bar函数,bar函数可用来打印日志'''
       print(m)
       # print('hello')
       # print('two:', os.getpid())
       # print('two:', os.getppid())
    
    if __name__ == '__main__':
       pool = multiprocessing.Pool(5) # 参数5代表进程池数量,如果为空则默认使用的是本机核数
       # print('one:', os.getpid())
       # print('one:', os.getppid())
       for x in range(100):
          # pool.apply(func=foo, args=(x,)) # apply()同步接口
          # pool.apply_async(func=foo, args=(x,))
          pool.apply_async(func=foo, args=(x,), callback=bar) # 在进程池获取一个进程,bar函数必须只能接收一个参数,foo执行成功把返回结果当作参数传给了bar函数
          # callback回调函数,就是某个动作或者函数执行成功后再去执行的函数;主进程创建子进程,callback回调函数是由主进程执行的,通过打印进程号就可发现
       pool.close()
       pool.join() # 必须是先close后join,这是固定顺序
       print('end')
    while True: print('studying...')
  • 相关阅读:
    编程心得5
    编程心得2
    心得2
    心得1
    7-11
    7-13
    7-9
    7-8
    7-12
    7-14
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14865993.html
Copyright © 2011-2022 走看看