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...')
  • 相关阅读:
    Emgucv使用中常用函数总结
    设置 omitempty 标签忽略空值字段
    Goland 中定义实时模板
    gorm Update
    Gorm 日期格式错误
    Gorm 多张表的自动迁移
    Sql取出各科分数前三名的学生,Sql各科成绩前三的学生
    美团Leaf分布式ID Leaf安装和使用,美团Leaf snowflake雪花算法模式,美团Leaf segment号段模式
    RocketMQ可靠消息最终一致性解决方案
    Windows安装RocketMQ,RocketMQ Windows安装和使用
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14865993.html
Copyright © 2011-2022 走看看