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 Django模板的使用方法(图文)
Nov 04 Python
使用graphics.py实现2048小游戏
Mar 10 Python
Python 查看文件的读写权限方法
Jan 23 Python
Python实现的建造者模式示例
Aug 06 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
python能自学吗
Jun 18 Python
Python如何给你的程序做性能测试
Jul 29 Python
小结Python的反射机制
Sep 28 Python
Python Django搭建文件下载服务器的实现
May 10 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创建PDF中文文档
2006/10/09 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
基于js中的原型(全面讲解)
2017/09/19 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
入学生会自荐书范文
2014/02/05 职场文书
银行委托书范本
2014/09/28 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
政风行风建设整改方案
2014/10/27 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
如何写观后感
2015/06/19 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技