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爬虫详解
Jan 03 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
详解小白之KMP算法及python实现
Apr 04 Python
python浪漫表白源码
Apr 05 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
详解python实现交叉验证法与留出法
Jul 11 Python
如何基于python实现归一化处理
Jan 20 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Python基础之字符串格式化详解
Apr 21 Python
Pillow图像处理库安装及使用
Apr 12 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校验表单检测字段是否为空的方法
2015/03/20 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
javascript Excel操作知识点
2009/04/24 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
pycharm安装图文教程
2017/05/02 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
行政办公员自我评价分享
2013/12/14 职场文书
服务质量承诺书
2014/03/27 职场文书
品德评语大全
2014/05/05 职场文书
家长会标语
2014/06/24 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
三峡人家导游词
2015/01/31 职场文书
妇产科护理心得体会
2016/01/22 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android