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 条件判断的缩写方法
Sep 06 Python
python实现udp数据报传输的方法
Sep 26 Python
Python之批量创建文件的实例讲解
May 10 Python
Linux下python制作名片示例
Jul 20 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
Pytorch释放显存占用方式
Jan 13 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
基于flask实现五子棋小游戏
May 25 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魔术方法功能与用法实例分析
2016/10/19 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Javascript动画效果(2)
2016/10/11 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
原生js实现轮播图
2017/02/27 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
顶碗少年教学反思
2014/02/21 职场文书
校庆活动策划方案
2014/06/05 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
葬礼主持词
2015/07/02 职场文书