zoukankan      html  css  js  c++  java
  • 40.多进程同步--锁--多把锁

    多进程同步 


    • 首先多进程默认是并发行为,多个进程同时执行
    • 执行的顺序,以及何时执行完毕无法控制
      • 多个进程如果涉及到了通信,数据的有序性无法保证
      • 需要锁来控制进程之间执行的顺序
      • 对于进程资源的控制
    • 缺点:同步进程,并发没有了。效率低下。
    • Lock:一把锁
    • Lock.acquire() 拿着锁 通信证
      • 抢占锁,如果拿不到,阻塞等待
    • Lock.release() 放掉锁
      • 一定要记得在工作完毕之后释放锁。
    • **Semaphore**:多把锁,同时提供多把锁/通行证,保证可以有一定个数的进程保持并发,这个用的多一点
      • s = Semaphore(3)
      • s.acquire()
      • s.release()
    • 一般情况下我们多进程操作数据库的时候必须加锁,这样才能保证数据的有序性
    • #多进程同步/锁
      from multiprocessing import Process,current_process,Lock
      import sys 
      from time import sleep
      def work(l):
              print('%s进程已经开始了' % current_process().name)
              l.acquire() #抢占这个通信证/锁
              for var in range(65,68):
                      print('%s:%s' % (current_process().name,chr(var)))
                      sys.stdout.flush()
              l.release() #放掉通行证
      def main():
              l = Lock()
              Process(target=work,name='a',args=(l,)).start()
              Process(target=work,name='b',args=(l,)).start()
              Process(target=work,name='c',args=(l,)).start()
      if __name__ == "__main__":
              main()
      

      运行结果:

      a进程已经开始了               y
      a:A
      a:B
      a:C
      b进程已经开始了
      b:A
      b:B
      b:C
      c进程已经开始了
      c:A
      c:B
      c:C
      
    • #多进程同步/多把锁(信号量)
      from multiprocessing import Process,current_process,Semaphore
      import sys 
      from time import sleep
      def work(s):
              print('%s进程已经开始了' % current_process().name)
              s.acquire()
              for var in range(65,100):
                      print('%s:%s' % (current_process().name,chr(var)))
                      sys.stdout.flush()
              s.release()
      def main():
              s = Semaphore(3) #通行证,限制同一时间提供了3把锁,也就是说同一时间最多3个进程同时工作,其余的进程阻塞等待,
              Process(target=work,name='a',args=(s,)).start()
              Process(target=work,name='b',args=(s,)).start()
              Process(target=work,name='c',args=(s,)).start()
              Process(target=work,name='d',args=(s,)).start()
              Process(target=work,name='e',args=(s,)).start()
      if __name__ == "__main__":
              main()
      

        

        

  • 相关阅读:
    ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项
    Oracle10g在Win2008R2下因版本无法安装问题的解决
    oracle 表被锁了解决方案
    用shell获得hadoop中mapreduce任务运行结果的状态
    发现一个c++ vector sort的bug
    跳青蛙问题与变态跳青蛙问题
    关于const *和 * const
    格雷码的计算(转)
    不安装oracle客户端,如何运行sqlplus
    Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题
  • 原文地址:https://www.cnblogs.com/zhangan/p/10262456.html
Copyright © 2011-2022 走看看