Python并发编程:多线程-信号量,Event,定时器

一 信号量

  信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from threading import Thread, Semaphore

import threading

import time

def func():

    sm.acquire()

    print('%s get sm' % threading.current_thread().getName())

    time.sleep(3)

    sm.release()

if __name__ == '__main__':

    sm = Semaphore(5)

    for in range(23):

        = Thread(target=func)

        t.start()

  解析

1

2

3

4

Semaphore管理一个内置的计数器,

每当调用acquire()时内置计数器-1

调用release()时内置计数器+1

计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其它线程调用rel()

  

二、Event

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其它线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象,而这个Event对象的标志为假,那么这个线程将会被一直阻塞至标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,它将忽略这个事件,继续执行

1

2

3

4

5

from threading import Event

Event.isSet()   # 返回Event的状态值

Event.wait()    # 如果event.isSet()==False将阻塞线程;

Event.set()     # 设置Event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统调度

Event.clear()   # 恢复Event的状态值为False

 

 例如:有多个工作线程尝试链接MySQL,我们想要在链接前确保MySQL服务正常才让那些工作线程去连接MySQL服务器,如果连接不成功,都会去尝试重新连接。那么

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

from threading import Thread, Event

import threading

import time, random

def conn_mysql():

    count = 1

    while not event.is_set():

        if count > 3:

            raise TimeoutError('链接超时')

        print('<%s>第%s次尝试链接' % (threading.current_thread().getName(), count))

        event.wait(0.5)

        count += 1

    print('<%s>链接成功' % threading.current_thread().getName())

def check_mysql():

    print('\033[45m[%s] 正在检查mysql\033[0m' % threading.current_thread().getName())

    time.sleep(random.randint(24))

    event.set()

if __name__ == '__main__':

    event = Event()

    conn1 = Thread(target=conn_mysql)

    conn2 = Thread(target=conn_mysql)

    check = Thread(target=check_mysql)

    conn1.start()

    conn2.start()

    check.start()

  

三 定时器

定时器,指定n秒后执行某操作

1

2

3

4

5

6

7

8

from threading import Timer

def hello():

    print('hello, world')

= Timer(1, hello)

t.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/425522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂

最大通过数 思路&#xff1a;假设左边能通过 x 关&#xff0c;右边能通过 y 关&#xff0c;x∈[0,n]&#xff0c;通过二分&#xff0c;在前缀和中枚举右边通过的关卡数&#xff0c;保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…

Windows下用crashRpt让C++程序崩溃自动生成dump

背景 我们的Windows c程序如果在客户或者没有代码调试的环境下崩溃了。我们只能从机器异常报错里得知寥寥无几的信息&#xff0c;如果程序崩溃时&#xff0c;能自动触发当前堆栈信息的收集&#xff0c;那么对于开发人员复现BUG就尤为重要 CrashRpt CrashRpt主要功能 1.崩溃报…

首例以“冠状病毒”为主题的勒索病毒,篡改系统MBR

前言概述 2020年勒索病毒攻击仍然是网络安全的最大威胁&#xff0c;在短短三个月的时间里&#xff0c;已经出现了多款新型的勒索病毒&#xff0c;关于2020年勒索病毒攻击新趋势&#xff0c;可以阅读笔者写的上一篇文章&#xff0c;里面有详细的分析&#xff0c;从目前观察到的…

【风格迁移】AdaAttN:使用注意力机制和归一化来保持内容结构的同时转移风格特征

AdaAttN&#xff1a;使用注意力机制和归一化来保持内容结构的同时转移风格特征 提出背景AdaAttN 框架自适应注意力归一化&#xff08;AdaAttN&#xff09;损失函数视频风格迁移的扩展 自适应注意力归一化&#xff08;AdaAttN&#xff09;的应用场景 全流程优化基于特征相似度的…

DbSchema导出HTML/PDF版表结构

一、连接数据库 登录成功默认显示当前用户的所有资源&#xff08;表、视图、序列、方法、触发器等&#xff09;&#xff0c;如果不操作将导出此用户的全部信息。 至此连接数据库完成 二、表结构导出 本次不想给用户全部导出&#xff0c;只给导出几张&#xff0c;选择需要…

Linux 学习笔记(10)

十、 进程管理 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如 LinuxSir.Org 所用的 WWW 服务器是 apache 服务器&#xff0c;当管理员启动服务后&#xff0c;可能会有好多人来访问&#xff0c;也就是说许多用户来同时请 求 htt…

C-V2X系列:C-V2X芯片及模组整理总结

C-V2X、车路协同、车联网、智能网联车学习 C-V2X芯片及模组整理总结

http 协议深入介绍

一&#xff0c;http 相关概念 &#xff08;一&#xff09;关键名词 1&#xff0c;互联网 是网络的网络&#xff0c;是所有类型网络的母集 2&#xff0c;因特网 世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成…

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务

做了一个基于 Swoole 的 WebSocket 扩展包&#xff0c;可以用来做实时状态推送&#xff0c;或者自定义消息处理实现 im&#xff0c;有需要的可以看看: [giorgio-socket] 使用方法 安装 安装扩展包 composer require wu/giorgio-socket发布配置文件 php artisan vendor:pu…

机器学习:数据处理基操

在处理完数据之后&#xff0c;选择好模型&#xff0c;就可以用训练集训练模型&#xff0c;用测试集输入模型 然后输出需要预测的结果啦&#xff5e; 一、模块导入 import numpy as np import pandas as pd #读入数据 二、pandas数据 一、dataframe基础 一、dataframe的创建…

图像处理ASIC设计方法 笔记6 数据拼接和帧格式校正

第四章大模板卷积ASIC设计方案 P80 实时图SPRM 数据位宽64bit,4个SPRAM,同时得到4行数据 绘制卷积芯片数据路径图,卷积芯片内部模块图 根据这个图,本书后续对各个模块都进行介绍。 P81 第一个模块 图像输入前端FIFO 学习图像处理中好的设计思路:帧格式校验和数据拼接 …

STM32+ESP8266水墨屏天气时钟:ESP8266连接心知天气获取数据

项目背景 利用STM32F103C8T6和ESP8266模块进行通信&#xff0c;获取心知天气的数据。 硬件设计为串口1(PA9和PA10)连接ESP8266. 串口2打印 一.ESP8266连接WIFI ESP8266模块可以通过AT指令控制搭配使用源代码API函数开发&#xff0c;总体开发速度快&#xff0c;难度较低。 说…

板子合集1.0

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/JK01WYX/ 文章目录 1.快速幂板子2.gcd得最大公约数3.堆优化的dijkstra板子4.线段树1板子 区间加线段…

Vue--》打造简易直播应用平台项目实战

今天开始使用 vue3 + ts 搭建一个简易直播应用平台项目,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本…

奇怪的需求之与图片做交互

1.起因 客户想要展示自己的地图,该地图上有各种工作数据,和工作点位,已有的地图不能满足需求.于是提出将这张图片当成大背景 2.经过 鉴于文件格式和尺寸的原因,协商后客户提出将图片做成缩放效果,同时具有点击效果,原先直接进入的主页,现在为点击图片中的某条线路进入主页面…

【论文阅读】多传感器SLAM数据集

一、M2DGR 该数据集主要针对的是地面机器人&#xff0c;文章正文提到&#xff0c;现在许多机器人在进行定位时&#xff0c;其视角以及移动速度与车或者无人机有着较大的差异&#xff0c;这一差异导致在地面机器人完成SLAM任务时并不能直接套用类似的数据集。针对这一问题该团队…

Sentinel 规则持久化,基于Redis持久化【附带源码】

B站视频讲解 学习链接&#x1f517; 文章目录 一、理论二、实践2-1、dashboard 请求Redis2-1-1、依赖、配置文件引入2-1-2、常量定义2-1-3、改写唯一id2-1-4、新Provider和Publisher2-1-5、改写V2 2-2、应用服务改造2-2-1、依赖、配置文件引入2-2-2、注册监听器 三、源码获取3…

从0到1实现自助棋牌室系统:技术调研

前言 春节返乡之际&#xff0c;发现老家县城竟然开了近十家棋牌室。巧的是朋友也有意涉足&#xff0c;便咨询我自助棋牌室的软件投入成本。作为程序员的我&#xff0c;在思考了自助棋牌室背后的技术需求后&#xff0c;嗅到了一丝丝商机&#xff1a;何不自己开发一个自助棋牌室…

操作系统的运行机制

目录 一. 特权指令与非特权指令二. 中断和异常2.1. 内中断2.2 外中断 三. 系统调用 注:很多人习惯把Linux、Windows、MacOS的“小黑框”中使用的命令也称为“指令”&#xff0c;其实这是“交互式命令接口”&#xff0c;注意与本节的“指令”区别开。本节中的“指令”指二进制机…

jenkins实战(1)

一, Jenkins官网介绍: Jenkins 持续集成、持续部署 下载地址:Jenkins download and deployment 提供两种类型: LTS(长期版)和Weekly(最近一周的版本) 注: 必须是Java8及以上版本(官网针对这一点有做说明) 二, 安装 下载war包,java -jar XXX --httpPort8081 或 下载war包…