#!/usr/bin/env python
# -*- coding:utf-8 -*- import threading
import time
import random # 1-互斥锁 Lock 同一时刻只能有1个线程运行,需要将锁传给任务函数
number = 0
lock = threading.Lock() def plus(lk):
global number #开始加锁
lk.acquire() for _ in range(1000000):
number += 1
print("子线程%s运算结束后,number = %s" % (threading.current_thread().getName(), number)) # 释放锁,让别的线程也可以访问number
lk.release() if __name__ == '__main__':
for i in range(2): # 需要把锁当做参数传递给plus函数
t = threading.Thread(target=plus, args=(lock,))
t.start() # 等待2秒,确保2个子线程都已经结束运算。
time.sleep(2) print("主线程执行完毕后,number = ", number) # 2-信号锁 Semaphore 允许一定数量的线程同时更改数据
def mythread(num,se):
se.acquire()
print("run the thread %s"%num) time.sleep(1) se.release() #允许2个线程同时允许
semaphore=threading.BoundedSemaphore(2) #启动6个线程
for i in range(6):
t=threading.Thread(target=mythread,args=(i,semaphore))
t.start() # 3-条件锁 codintion 多个线程运行时,当一个线程执行后,在满足一定条件下,暂停执行当前线程,执行另一线程
num=0
con=threading.Condition() class mythread(threading.Thread):
def __init__(self,name,action):
super(mythread,self).__init__()
self.name=name
self.action=action def run(self):
global num
con.acquire() print("开始执行%s"%self.name)
while True:
if self.action=="add":
num+=1
elif self.action=="reduce":
num-=1
else:
exit(1)
print("当前num为:",num) time.sleep(1) if num==5 or num==0:
print("%s暂停执行"%self.name)
con.notify()
con.wait()
print("%s开始执行"%self.name)
con.release() if __name__=="__main__":
t1=mythread("线程1","add")
t2=mythread("线程2","reduce")
t1.start()
t2.start() # 4-事件锁 全局定义一个flag 当flag=False,线程调用wait(),被阻塞,不执行,当flag=True,线程不在阻塞
# set()->flag=True clear()->flag=False wait()->等待红绿灯信号 is_set()->是否放行状态
t=threading.Event() def lighter():
# 绿灯时间
gree_time=5 # 红灯时间
red_time=5 # 初始为红灯
t.set() while True:
print("\33[32;0m 绿灯亮...\033[0m")
time.sleep(gree_time)
t.clear() print("\33[32;0m 红灯亮...\033[0m")
time.sleep(red_time)
t.set() def runcar(name):
while True:
if t.is_set():
print("一辆[%s] 呼啸开过..." % name)
time.sleep(1)
else:
print("一辆[%s]开来,看到红灯,无奈的停下了..." % name)
t.wait()
print("[%s] 看到绿灯亮了,瞬间飞起....." % name) if __name__=="__main__":
light=threading.Thread(target=lighter,)
light.start() for name in ['奔驰', '宝马', '奥迪']:
car=threading.Thread(target=runcar,args=(name,))
car.start() #5-定时器Timer 在指定时间过后执行某个函数
def getNum():
rand=random.random()
print(rand) t=threading.Timer(4,getNum)
t.start()

python3线程介绍02(线程锁的介绍:互斥、信号、条件、时间、定时器)的更多相关文章

  1. Java多线程系列 JUC线程池02 线程池原理解析(一)

    转载  http://www.cnblogs.com/skywang12345/p/3509960.html ; http://www.cnblogs.com/skywang12345/p/35099 ...

  2. 【C#】C#线程_混合线程的同步构造

    目录结构: contents structure [+] 一个简单的混合锁 FCL中的混合锁 ManualResetEventSlim类和SemaphoreSlim类 Monitor类和同步块 Rea ...

  3. Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程

    一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...

  4. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  5. Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10739579.html,希望大家多多支持!!! 一.线程基础 1.线程与进程 线程是指进程 ...

  6. Java并发包中线程池的种类和特点介绍

    Java并发包提供了包括原子量.并发集合.同步器.可重入锁.线程池等强大工具这里学习一下线程池的种类和特性介绍. 如果每项任务都分配一个线程,当任务特别多的时候,可能会超出系统承载能力.而且线程的创建 ...

  7. Python3 进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  8. C#通过接口与线程通信(捕获线程状态)介绍

    C#通过接口与线程通信(捕获线程状态)介绍 摘要:本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考. 提示:本文所提到的线程状态变化,并不是指线程启动.暂停.停止,而是说线程 ...

  9. concurrent.futures模块简单介绍(线程池,进程池)

    一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...

  10. 内存池、进程池、线程池介绍及线程池C++实现

    本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...

随机推荐

  1. HTTP协议和WebSocket协议(二)

    WebSocket WebSocket协议还很年轻,RFC文档相比HTTP的发布时间也很短,它的诞生是为了创建一种「双向通信」的协议,来作为HTTP协议的一个替代者.那么首先看一下它和HTTP(或者H ...

  2. vmware正在使用中问题

    解决方法:找到vmware目录下的.lck文件,将其删掉即可.

  3. 关于c++中const的基本用法

    c++中的const 有点类似于c里的宏定义#define,但是似乎是在宏定义基础上的代码优化,具体我解释不清,下面主要提到的是 const 在c++中的3中基本用法: 1.指向常量的指针 例如:co ...

  4. 精简的网站reset和css通用样式库

    一.CSS reset body{ line-height:1.4; color:#; font-family:arial; font-size: 12px; } input,textarea,sel ...

  5. Linux字符设备简单示例

    1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...

  6. Python-Anaconda练习candy算子用于边缘提取,再用hough变换检测直线边缘

    img: 待检测的图像. threshold: 阈值,可先项,默认为10 line_length: 检测的最短线条长度,默认为50 line_gap: 线条间的最大间隙.增大这个值可以合并破碎的线条. ...

  7. 一些自己编写的简单的js

    图片在窗口内弹来弹去的效果 <div class="FrontAdv_float01-default" style="position: absolute;z-in ...

  8. Mockjs详细使用说明

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 在我们的生产实际中,后端的接口往往是 ...

  9. 配置WAMP完美攻略

    软件介绍 Wamp Server 是一款功能强大的PHP 集成安装环境. 为了节约时间,本次使用 Wamp Server 来进行配置. wamp 的全部含义就是本篇文章的标题. 使用版本和操作系统 W ...

  10. Linux 文件锁flock 实现两个进程相互监听存活状态

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...