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简单的实现树莓派的WEB控制
Feb 18 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
python类中super() 的使用解析
Dec 19 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python如何进行时间处理
Aug 06 Python
Django websocket原理及功能实现代码
Nov 14 Python
浅析python实现动态规划背包问题
Dec 31 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
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js常用函数 不错
2006/09/08 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
vue实现计算器功能
2020/02/22 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python深入学习之闭包
2014/08/31 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
Python中的Django基本命令实例详解
2018/07/15 Python
python实现决策树分类
2018/08/30 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
光荣入党自我鉴定
2014/01/22 职场文书
大学生创业感言
2014/01/25 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
党员领导干部承诺书
2014/05/28 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
党员对照检查材料
2014/09/22 职场文书
合同审查法律意见书
2015/06/04 职场文书