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


Posted in Python onFebruary 11, 2018

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

采用f_flag的方法效率低

创建锁

mutex=threading.Lock()

锁定

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

释放

mutex.release()

import threading 
from threading import Thread 
from threading import Lock 
import time 
 
thnum=0 
#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之 
class MyThread(threading.Thread): 
  def run(self): 
    mutex.acquire() 
    for i in range(10000): 
      global thnum 
      thnum+=1   
    print(thnum) 
    mutex.release()  
def test(): 
  global thnum 
  mutex.acquire() #等待可以上锁,通知而不是轮训,没有占用CPU 
  for i in range(10000): 
    thnum+=1 
  print(thnum) 
  mutex.release()#解锁 
mutex=Lock() 
if __name__=='__main__': 
  t=MyThread() 
  t.start() 
 
#创建一把互斥锁,默认是没有上锁的 
 
thn=Thread(target=test) 
thn.start() 
 
''''' 
10000 
20000 
'''

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

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

import threading 
from threading import Thread 
from threading import Lock 
import time 
 
thnum=0 
#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之 
class MyThread(threading.Thread): 
  def run(self): 
    for i in range(10000): 
      mutex.acquire() 
      global thnum 
      thnum+=1 
      mutex.release()#释放后,都开始抢,这样上锁的时间变短  
    print(thnum) 
     
def test(): 
  global thnum 
  for i in range(10000): 
    mutex.acquire() 
    thnum+=1 
    mutex.release()#解锁 
  print(thnum) 
mutex=Lock() 
if __name__=='__main__': 
  t=MyThread() 
  t.start() 
 
#创建一把互斥锁,默认是没有上锁的 
 
thn=Thread(target=test) 
thn.start() 
 
''''' 
10000 
20000 
'''

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

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

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

异步:

#异步的实现 
from multiprocessing import Pool 
import time 
import os 
 
#getpid()获取当前进程的进程号 
#getppid()获取当前进程的父进程号 
 
def test():#子进程 
  print("----进程池中的进程-----pid=%d,ppid=%d --"%(os.getpid(),os.getppid())) 
  for i in range(3): 
    print("-----%d----"%i) 
    time.sleep(1) 
  return "over" #子进程执行完后返回给操作系统,返回给父进程 
 
def test2(args): 
  print("-----callback func----pid=%d"%os.getpid())#主进程调用test2 
  print("------callback func---args=%s"%args) 
 
def main(): 
  pool=Pool(3) 
  pool.apply_async(func=test,callback=test2)#回调 
  time.sleep(5)#收到func进程结束后的信号后,执行回调函数test2 
 
  print("----主进程-pid = %d"%os.getpid()) 
 
if __name__=="__main__": 
  #main() 
  pool=Pool(3) 
  pool.apply_async(test,callback=test2)#回调 
  time.sleep(5)#收到func进程结束后的信号后,执行回调函数test2 
 
  print("----主进程-pid = %d"%os.getpid()) 
 
'''''显示结果不太正确,应该先运行test呀,再运行test2 
-----callback func----pid=7044 
------callback func---args=over 
----主进程-pid = 7044 
----进程池中的进程-----pid=3772,ppid=7044 -- 
-----0---- 
-----1---- 
-----2---- 
'''
Python 相关文章推荐
深入理解python中的浅拷贝和深拷贝
May 30 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
python实现黑客字幕雨效果
Jun 21 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
带你认识Django
Jan 15 Python
Python一行代码实现快速排序的方法
Apr 30 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
最小二乘法及其python实现详解
Feb 24 Python
Vs Code中8个好用的python 扩展插件
Oct 12 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
Python数据结构之队列详解
Mar 21 Python
python编程嵌套函数实例代码
Feb 11 #Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 #Python
Django自定义manage命令实例代码
Feb 11 #Python
Python实现的购物车功能示例
Feb 11 #Python
python PyTorch参数初始化和Finetune
Feb 11 #Python
Python装饰器用法示例小结
Feb 11 #Python
python PyTorch预训练示例
Feb 11 #Python
You might like
PHP中显示格式化的用户输入
2006/10/09 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
python判断自身是否正在运行的方法
2019/08/08 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
浅谈Python中的继承
2020/06/19 Python
Python如何在bool函数中取值
2020/09/21 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
新电JAVA笔试题目
2014/08/31 面试题
房屋继承公证书
2014/04/10 职场文书
新品发布会策划方案
2014/06/08 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android