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实现画圆功能
Jan 25 Python
基于DataFrame改变列类型的方法
Jul 25 Python
Python动态生成多维数组的方法示例
Aug 09 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
python+mysql实现教务管理系统
Feb 20 Python
Django之无名分组和有名分组的实现
Apr 16 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
python函数调用,循环,列表复制实例
May 03 Python
python实例化对象的具体方法
Jun 17 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 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
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
初识ThinkPHP控制器
2016/04/07 PHP
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
从零学Python之入门(二)基本数据类型
2014/05/25 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Python使用django搭建web开发环境
2017/06/09 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python web框架中实现原生分页
2019/09/08 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
万里长城导游词
2015/01/30 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
JS函数式编程实现XDM一
2022/06/16 Javascript