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写的一个文本编辑器
Jan 23 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
基于Pytorch SSD模型分析
Feb 18 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
如何通过安装HomeBrew来安装Python3
Dec 23 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
flask框架视图函数用法示例
2018/07/19 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
学生会离职感言
2014/02/11 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
小学清明节活动方案
2014/03/08 职场文书
旅游节目策划方案
2014/05/26 职场文书
置业顾问岗位职责
2015/02/09 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python