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 uuid模块使用实例
Apr 08 Python
python解析xml文件实例分析
May 27 Python
浅谈python中requests模块导入的问题
May 18 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Python坐标线性插值应用实现
Nov 13 Python
python队列原理及实现方法示例
Nov 27 Python
Python文件操作函数用法实例详解
Dec 24 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
详解python logging日志传输
Jul 01 Python
Python 如何定义匿名或内联函数
Aug 01 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/12/31 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
js实现各浏览器全屏代码实例
2018/07/03 Javascript
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
校园十大歌手策划书
2014/02/01 职场文书
职工运动会邀请函
2014/02/02 职场文书
企业消防安全制度
2014/02/02 职场文书
《乌塔》教学反思
2014/02/17 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
mysql 索引合并的使用
2021/08/30 MySQL
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL