文档章节

~~并发编程(十三):信号量,Event,定时器~~

o
 osc_g8254g7s
发布于 2019/08/19 00:00
字数 853
阅读 3
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

<center><h3>进击のpython</h3></center> *****

并发编程——信号量,Event,定时器


本节需要了解的就是:

信号量,以及信号量和互斥锁的区别

了解时间和定时器,以及使用


信号量

信号量也是锁,本质没有变!但是他跟互斥锁同一时间只能有一个任务抢到锁去执行来说

信号量同一时间可以有很多个任务拿到锁去执行

如果说互斥锁是一帮人抢一个厕所,那信号量就是一帮人抢夺多个厕所

def func():
    with sm:
        print('%s get sm' % threading.current_thread().getName())
        time.sleep(3)


if __name__ == '__main__':
    sm = Semaphore(5)
    for i in range(23):
        t = Thread(target=func)
        t.start()

上面的代码可能对with不够了解,作为上下文管理,也可以用在开关锁上,就像文件的打开关闭一样

  1. Semaphore管理一个内置的计数器,
  2. 每当调用acquire()时内置计数器+1
  3. 调用release() 时内置计数器-1
  4. 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()

Event事件

线程的关键特性是每个线程都是独立运行的,且状态都是深不可测的

如果需要根据A线程的运行状态来确定B进程是否运行,那可就太难了

为了解决这个问题,我们就需要Event对象,他可以设置一个标志

等到代码执行到你想要的状态的时候,他就把这个状态设置为真

你就可以接受这个状态然后执行

他有一些方法:

event.isSet():返回event的状态值; event.wait():如果 event.isSet()==False将阻塞线程; event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度; event.clear():恢复event的状态值为False

import time
from threading import Thread, Event


def A():
    print("我是A线程,我在等待B线程执行结束.. ..")
    event.wait()
    print("我是A线程,我执行完了!")


def B():
    print('我是B线程,我要开始执行了.. .. ')
    time.sleep(1)
    print('我是B线程,我执行完了!')
    event.set()


if __name__ == '__main__':
    event = Event()
    t1 = Thread(target=A)
    t2 = Thread(target=B)
    t1.start()
    t2.start()

执行结果如下:

我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. .. 
我是B线程,我执行完了!
我是A线程,我执行完了!

可以看到,尽管A先执行的,

但是后面的代码是在等待着B的执行完毕才执行

所以我们的目的达到了


定时器

程序n秒之后执行

import time
from threading import Thread, Event, Timer


def A():
    print("我是A线程,我在等待B线程执行结束.. ..")
    event.wait()
    print("我是A线程,我执行完了!")


def B():
    print('我是B线程,我要开始执行了.. .. ')
    time.sleep(1)
    print('我是B线程,我执行完了!')
    event.set()


def func():
    print("都执行完了该我了!", time.time() - start_time)


if __name__ == '__main__':
    event = Event()
    t = Timer(3, func)  # 定时器,3s后执行func
    t1 = Thread(target=A)
    t2 = Thread(target=B)
    start_time = time.time()
    t.start()  # 发信号
    t1.start()
    t2.start()

我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. .. 
我是B线程,我执行完了!
我是A线程,我执行完了!
都执行完了该我了! 3.0026462078094482

<center>*****</center> <center>*****</center>

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
并发编程之多线程

一、threading模块介绍   multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍   官网链接:点击进入 二、开启线程的两种方式   mul...

osc_ljezv5mf
2018/05/08
2
0
python并发编程之多线程

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.htm...

osc_45omoec3
2018/01/25
2
0
DAY9-python并发之多线程

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.htm...

osc_e4gzv47r
2018/02/09
1
0
并发编程之Operation Queue和GCD

并发编程之GCD 在《并发编程之Operation Queue》中讲了Cocoa并发编程中的Operation Queue,了解了Operation Queue是一个面向对象的并发编程接口,它支持并发数,线程优先级,任务优先级,任务...

人独立
2015/01/15
47
0
多线程

并发编程之多线程(理论) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3...

osc_on5pjexo
04/16
2
0

没有更多内容

加载失败,请刷新页面

加载更多

未捕获ReferenceError:未定义$? - Uncaught ReferenceError: $ is not defined?

问题: How come this code throws an 此代码如何引发 Uncaught ReferenceError: $ is not defined 未捕获的ReferenceError:未定义$ when it was OK before? 以前什么时候可以? $(document......

javail
42分钟前
12
0
263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
今天
60
0
HCIA_ARP01

ARP(地址解析协议) eNSP 常用路由器:AR2220 常用交换机:S5700、S3700 常用终端:PC、MCS(主播服务器) 设备连线:Copper(以太网用到的双绞线)、Serial(串口线,2SA接口)、Auto(自动连...

创业789
今天
25
0
如何在Rails 4中使用问题 - How to use concerns in Rails 4

问题: The default Rails 4 project generator now creates the directory "concerns" under controllers and models. 默认的Rails 4项目生成器现在在控制器和模型下创建目录“Concer”。 ......

fyin1314
今天
19
0
【LeetCode】 57 括号生成

题目: 解题思路: https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 代码: import java.util.ArrayList;import java.util.List;publ......

JaneRoad
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部