python互斥锁,加锁,同步机制,异步通信知识总结

  

某个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改,直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。

  

采用f_flag的方法效率低

  

<>强创建锁
  

  

互斥=threading.Lock ()
  

  

<强>锁定
  

  

mutex.acquire([阻塞])#里面可以加屏蔽(等待的时间)或者不加,不加就会一直等待(堵塞)
  

  

<强>释放
  

  

mutex.release ()         进口线程   从线程进口线程   从线程进口锁   导入的时间      thnum=0   #两个线程都在抢着对这个锁进行上的锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之   类MyThread (threading.Thread):   def运行(自我):   mutex.acquire ()   因为我在范围(10000):   全球thnum   thnum +=1   打印(thnum)   mutex.release ()   def测试():   全球thnum   mutex.acquire() #等待可以上的锁,通知而不是轮训,没有占用CPU   因为我在范围(10000):   thnum +=1   打印(thnum)   mutex.release() #解锁   互斥锁=()   if __name__==癬_main__”:   t=MyThread ()   t.start ()      #创建一把互斥锁,默认是没有上锁的      而不是=线程(目标=测试)   thn.start ()      ”“”   10000   20000   " 之前      

只要一上锁,由多任务变为单任务,相当于只有一个线程在运行。
  

  

下面的代码相对上面加锁的时间变短了

        进口线程   从线程进口线程   从线程进口锁   导入的时间      thnum=0   #两个线程都在抢着对这个锁进行上的锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之   类MyThread (threading.Thread):   def运行(自我):   因为我在范围(10000):   mutex.acquire ()   全球thnum   thnum +=1   mutex.release() #释放后,都开始抢,这样上锁的时间变短   打印(thnum)      def测试():   全球thnum   因为我在范围(10000):   mutex.acquire ()   thnum +=1   mutex.release() #解锁   打印(thnum)   互斥锁=()   if __name__==癬_main__”:   t=MyThread ()   t.start ()      #创建一把互斥锁,默认是没有上锁的      而不是=线程(目标=测试)   thn.start ()      ”“”   10000   20000   " 之前      

只有必须加锁的地方才加锁

  

同步:按照预定的先后顺序执行

  

一个运行完后,释放下一个,下一个锁定后运行,再释放下一个,下一个锁定后,运行后释放下一个.....释放第一个

  

异步:         #异步的实现   从多处理导入池   导入的时间   进口操作系统      # getpid()获取当前进程的进程号   # getppid()获取当前进程的父进程号      def测试():#子进程   打印(“——进程池中的进程- - - - - pid=% d, ppid=% d——“% (os.getpid (), os.getppid ()))   因为我在范围(3):   print (“% d - - - - - - - - - - -”%我)   time . sleep (1)   返回”“#子进程执行完后返回给操作系统,返回给父进程      def test2 (args):   打印(“- - - - -回调函数——pid=% d % os.getpid()) #主进程调用test2   打印(“- - - - - -回调函数,参数=% s " % args)      def main ():   池=池(3)   pool.apply_async (func=测试,调=test2) #回调   time . sleep(5) #收到func进程结束后的信号后,执行回调函数test2      打印(“- - - - -主进程pid=% d % os.getpid ())      if __name__==癬_main__”:   # main ()   池=池(3)   pool.apply_async(测试、调=test2) #回调   time . sleep(5) #收到func进程结束后的信号后,执行回调函数test2      打印(“- - - - -主进程pid=% d % os.getpid ())      ”“显示结果不太正确,应该先运行测试呀,再运行test2   - - - - -回调函数——pid=7044   - - - - - -回调函数——args=- - - - -主进程pid=7044   ——进程池中的进程- - - - - pid=3772, ppid=7044—   - - - - - - - - - - 0   - - - - - - - - - - 1   - - - - - - - - - - 2   "

python互斥锁,加锁,同步机制,异步通信知识总结