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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python对List中的元素排序的方法
Apr 01 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
Python2 与Python3的版本区别实例分析
Mar 30 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
通过代码实例了解Python sys模块
Sep 14 Python
python 从list中随机取值的方法
Nov 16 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中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
Javascript执行效率全面总结
2013/11/04 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
Python数组定义方法
2016/04/13 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python递归法解决棋盘分割问题
2019/07/17 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
python 录制系统声音的示例
2020/12/21 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
个人租房协议书
2014/11/28 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
汽车转让协议书
2015/01/29 职场文书
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android