线程同步:

一个场景:

  一个列表里所有元素都是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-线程同步的更多相关文章

  1. Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  2. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

  3. C#多线程之线程同步篇2

    在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...

  4. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  5. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  6. 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

    [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...

  7. IOS 多线程,线程同步的三种方式

    本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...

  8. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  9. Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...

  10. MFC——9.多线程与线程同步

    Lesson9:多线程与线程同步 程序.进程和线程是操作系统的重点,在计算机编程中.多线程技术是提高程序性能的重要手段. 本文主要解说操作系统中程序.进程和线程之间的关系,并通过相互排斥对象和事件对象 ...

随机推荐

  1. 【Python】继承

    子类的方法__init__() 创建子类的实例时,Python首先需要完成的任务是给父类所有属性赋值,为此,子类的方法__init__()需要父类施以援手. class Car(): '''模拟汽车' ...

  2. Timer与ScheduledExecutorService间的抉择

    java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务").但是,Timer存在一 ...

  3. Lua学习一----------开发环境搭建

    © 版权声明:本文为博主原创文章,转载请注明出处 1.LuaDist下载地址:http://luadist.org/ 2.LuaRocks下载地址:https://github.com/luarock ...

  4. Html简单的整页切换

    恩,语言组织不是很好,直接上代码吧.... <!DOCTYPE html> <html> <head lang="en"> <meta c ...

  5. GIT客户端的使用【原创】

    这次分享的方式,采用的是视频的形式,视频是本人录制. 在做项目使用SVN的时候经常有各种错误出现,所以萌发使用git的想法.在学习git的过程中发现一个神器就是分支,虽然在SVN里也有分支,但由于机制 ...

  6. 小明同学喜欢体育锻炼,他常常去操场上跑步。跑道是一个圆形,在本题中,我们认为跑道是一个半径为R的圆形,设圆心的坐标原点(0,0)。小明跑步的起点坐标为(R,0),他沿着圆形跑道跑步,而且一直沿着一个方向跑步。回到家后,他查看了自己的计步器,计步器显示他跑步的总路程为L。小明想知道自己结束跑步时的坐标,但是他忘记自己是沿着顺时针方向还是逆时针方向跑的了。他想知道在这两种情况下的答案分别是多少。

    include "stdafx.h" #include<iostream> #include<vector> #include<string> ...

  7. SpringBoot 定时任务升级篇(动态修改cron参数)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲: ()简单方式:修改 ...

  8. linux 上操作常用的命苦与出错的地方

    帮助信息 ./configure -help|grep mysql 出错提示安装libxml2 tar -zxvf libxml2xxxx.tar cd libxml2xxx ./configure ...

  9. 转载 OSX开发推荐书籍列表

    初级 (开发语言, 开发工具)Objective-C Beginner's GuideObjective-C for Absolute Beginners 2nd EditionLearning Co ...

  10. SQL ROW_NUMBER() 分页使用示例

    ALTER PROC [dbo].[TestProPage] , AS BEGIN SELECT * FROM (SELECT *,ROW_NUMBER() OVER(ORDER BY IndexID ...