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...')
  • 相关阅读:
    Redis安装使用
    Freeswitch(四):使用java esl写一个FreeSwitchEventListener 服务
    Freeswitch(三):常用配置
    FreeSwitch(一):安装
    常用SQL之:统计重复数据的条数
    常用SQL之:递归查询
    常用SQL之:存储过程事务回滚
    常用SQL之:联表更新
    初学java——关于类、构造方法、变量、属性
    eclipse的一些实用快捷键
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14865993.html
Copyright © 2011-2022 走看看