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 相关文章推荐
在Linux中通过Python脚本访问mdb数据库的方法
May 06 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
Python中强大的命令行库click入门教程
Dec 26 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
python字符串和常用数据结构知识总结
May 21 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python为何不支持switch语句原理详解
Oct 21 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
js的OOP继承实现(必看篇)
2017/02/18 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
教室标语大全
2014/06/21 职场文书
学校重阳节活动总结
2015/03/24 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server