python-多线程2-线程同步
线程同步:
一个场景:
一个列表里所有元素都是0,线程A从后向前把所有元素改成1,而线程B负责从前往后读取列表并打印.
那么,可能线程A开始改的时候,线程B便来打印列表了,输出就变成一半0一半1,这就是数据的不同步
线程同步就是为了防止这个,同时也引入了锁的概念.Lock和Rlock可以实现线程同步.这两个对象都有
acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间.
你可以理解为这两个方法之间的东西会被锁定.
每当一个线程比如A要访问共享数据时,必须先获得锁定;如果已经有别的线程比如B获得锁定了,那么就让线程A暂停,
也就是同步阻塞;等到线程B访问完毕,释放锁之后,再让线程A继续
经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1
常用方法:
threading.Lock() 同一线程不能连续多次acquire,否则死锁
threading.RLock() 同一线程允许连续acquire,但是acquire和release必须成对出现
import threading
import time #用于停顿的 class myThread(threading.Thread): #使用多线程,必须要继承父类threading.Thread
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self) #固定格式,相当于线程的初始化
self.threadID = threadID
self.name = name
self.counter = counter
print('初始化完成') def run(self): #你不能确定run()在不同线程间的执行顺序,这个由CPU处理来决定的
print("开始线程" + self.name) #获取锁,成功获得锁定后返回True,可选的timeout参数不填时将一直阻塞直到获得锁定
threadLock.acquire()
print_time(self.name,self.counter,3)
#释放锁,开始下一个线程
threadLock.release() def print_time(threadName,counter,delay):
while counter:
time.sleep(delay)#停顿5s
print("%s:%s"%(threadName,time.ctime(time.time())))#打印线程名和时间
counter = counter - 1 threadLock = threading.Lock() #方法返回一个值,用变量threadLock接收
threads = [] #暂时忽略这句 #创建线程,生成两个对象
thread1 = myThread(1,"Thread-1",1)
thread2 = myThread(2,"Thread-2",2) #开启线程
thread1.start() #启动线程,每个线程对象必须至少调用一次该函数,他会自动调用run()方法
thread2.start() #将两个线程追加到空列表
threads.append(thread1)
threads.append(thread2) #join([time]) 等待至线程中止.这阻塞调用线程直至线程的join()方法被调用中止,正常退出或者抛出
#未处理的异常,或者可选的超时反生
#检测线程是否全都运行完成,等待完成后,再执行join()之后的内容
for t in threads:
t.join() print("我等到花儿也谢了,海儿也哭了,嗯,活该...")
结果:
初始化完成
初始化完成
开始线程Thread-1
开始线程Thread-2
Thread-1:Sat Jun 17 01:22:44 2017
Thread-2:Sat Jun 17 01:22:47 2017
Thread-2:Sat Jun 17 01:22:50 2017
我等到花儿也谢了,海儿也哭了,嗯,活该...
python-多线程2-线程同步的更多相关文章
- Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- IOS 多线程,线程同步的三种方式
本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...
- MFC——9.多线程与线程同步
Lesson9:多线程与线程同步 程序.进程和线程是操作系统的重点,在计算机编程中.多线程技术是提高程序性能的重要手段. 本文主要解说操作系统中程序.进程和线程之间的关系,并通过相互排斥对象和事件对象 ...
随机推荐
- UNP学习笔记(第三章:套接字编程简介)
本章开始讲解套接字API. 套接字地址结构 IPv4套接字地址结构 它以sockaddr_in命名,下面给出它的POSIX定义 struct in_addr { in_addr_t s_addr; } ...
- swiper-demo1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- hibernate批量更新和删除数据
批量处理 不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过,听说 ...
- Java 8 Collectors to Map
1. 介绍 在本教程中,我们将讨论Collectors类的toMap()方法.我们使用它将流收集到一个Map实例中. 对于本教程中涉及的所有示例,我们将使用图书列表作为数据源,并将其转换为不同的Map ...
- Android防止过快点击造成多次事件
问题 onClick事件是Android开发中最常见的事件. 比方,一个submitButton.功能是点击之后会提交一个订单, 则一般代码例如以下,当中submitOrder()函数会跳转到下一页进 ...
- p2p webrtc服务器搭建系列1: 房间,信令,coturn打洞服务器
中继(relay) 在RTCPeeConnection中,使用ICE框架来保证RTCPeerConnection能实现NAT穿越 ICE,全名叫交互式连接建立(Interactive Connecti ...
- cesium学习--初识
一.Cesium 官方介绍:CesiumJS是一个开源的JavaScript库,用于世界级的3D地球仪和地图.任务是为静态和时间动态的内容创建领先的3D地球和地图,具有最好的性能.精度.视觉质量.平台 ...
- doT.js具体使用介绍
官网: http://olado.github.iodoT.js具体使用介绍 用法: {{= }} for interpolation {{ }} for evaluation {{~ }} for ...
- System.TypeLoadException: Could not load type 'System.IO.Compression.CompressionLevel' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
1.提示错误信息: zipSystem.TypeLoadException: Could not load type 'System.IO.Compression.CompressionLevel' ...
- inclusion_tag 看图