某个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改,直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。
采用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互斥锁,加锁,同步机制,异步通信知识总结