线程中的信号量和事件

# 线程中的信号量
    # 和进程中的信号量概念一样,创建好信号量的深度后,同一时间只有n个线程可以访问被信号量保护的代码

# 同一时间只有4个线程可以访问被信号量保护的代码
# import time
# from threading import Semaphore, Thread
#
# def func(sem, a, b):
#     sem.acquire()
#     time.sleep(1)
#     print(a + b)
#     sem.release()
#
# if __name__ == ‘__main__‘:
#
#     sem = Semaphore(4)  # 创建信号量,4个深度
#     for i in range(10):
#         t = Thread(target=func, args=(sem, i, i + 5))
#         t.start()

# 线程中的事件
    # 和进程中的事件概念一样
    # 事件的状态
        # False状态
            # wait()阻塞
        # True状态
            # wait()非阻塞
    # 改变事件的状态
        # clear()设置事件状态为Flase,即使wait()阻塞
        # set()设置事件状态为True,即使wait()非阻塞

# 线程中的事件例子
    # 模拟
        # 连接数据库
        # 检测数据库的可连接情况
        # 起两个线程
            # 第一个线程:连接数据库
                # 第一个线程会阻塞等待这个事件,等待一个信号,这个信号来告诉自己和数据库之间的网络是通的
            # 第二个线程:检测与数据库之间的网络是否是通的
                # 模拟延时一会后,将事件的状态设置为True,使这个事件变为非阻塞,此时第一个线程就会检测到该事件为非阻塞,则会知道与数据库之间的网络是通的

import time
import random
from threading import Event, Thread

def connect_db(e):
    ‘‘‘
    模拟检测数据库可以连接后,则连接数据库
    :param e:
    :return:
    ‘‘‘
    count = 3
    while count > 0:
        #e.wait()    # 如果事件e为False,则会阻塞在这里
        e.wait(1)    # wait可以带参数,表示如果事件是阻塞的话,这里最长会阻塞1S中
        if e.is_set() == True:  # 检测下事件是否为非阻塞,因为到这里可能是wait阻塞超时导致(这种事件状态还是为False阻塞),也可能确实是检测网络的线程发的解除阻塞信号
            print(‘连接数据库‘)
            break
        else:
            print(‘连接数据库超时‘)
            count -= 1
    else:
        print(‘连接数据库到了上限次还没有连接数据库成功‘)
        raise TimeoutError  # 主动抛出一个超时异常

def check_web(e):
    ‘‘‘
    检测数据库可连接情况,模拟延时一会后,将事件设置为True,变为非阻塞,表示网络是通的
    :param e: 事件
    :return:
    ‘‘‘
    time.sleep(random.randint(0, 5))
    e.set()

if __name__ == ‘__main__‘:
    e = Event() # 事件创建好后,默认是False阻塞的
    t = Thread(target=connect_db, args=(e, ))
    t2 = Thread(target=check_web, args=(e, ))
    t.start()
    t2.start()

    t.join()
    t2.join()

原文地址:https://www.cnblogs.com/whylinux/p/9858941.html

时间: 2024-11-05 21:50:13

线程中的信号量和事件的相关文章

Win32 线程的创建&信号量临界资源&事件对象

背景: 写了个程序,主要实现的功能为主线程创建两个子线程,之后主线程进入等待事件的循环.子线程1对临界资源cnt的值减2并输出cnt的值.子线程2对cnt的值加1并输出cnt的值,且当cnt为50的时候触发事件对象hend_even,子进程2退出.主线程收到hend_even后杀死子线程1,之后进入scanf阻塞... 代码示例: #include <windows.h> #include <stdio.h> DWORD WINAPI funAproc(LPVOID lpParam

12、第七周-网络编程 - 线程中的信号量(Semaphore)

互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据.简单介绍如下: 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作.而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的. 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比

线程--守护线程、线程锁、信号量、事件、条件、定时器、队列、池(三)

守护线程 import timefrom threading import Threaddef func1(): while True: print('*'*10) time.sleep(1)def func2(): print('in func2') time.sleep(5) t = Thread(target=func1,)t.daemon = Truet.start()t2 = Thread(target=func2,)t2.start()t2.join() #加join后会等待func

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) (转)临界区,互斥量,信号量,事件的区别(线程同步) . 分类: C++ windows 核心编程 2012-04-10 14:55 3321人阅读 评论(0) 收藏 举报 semaphoremfcnulleventsthreadhttp服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个

(转)临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) 分类: C++ windows 核心编程 2012-04-10 14:55 2064人阅读 评论(0) 收藏 举报 semaphore mfc null events thread http服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通

在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good

引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QTimer::start()后仅仅是在系统的定时器向量表中添加了一个定时器对象,但定时器并没有真正开启.定时器的开启需要通过processEvent()开始的一系列调用后才会真正得开启,这个过程中会处理定时器向量表中所有的定时器对象.那么实际exec()中也是在不断地调用processEvent()方

Python进阶(3)_进程与线程中的lock(互斥锁、递归锁、信号量)

1.同步锁 (Lock) 当各个线程需要访问一个公共资源时,会出现数据紊乱 例如: 1 import threading,time 2 def sub(): 3 global num #对全局变量进行操作 4 5 temp=num 6 time.sleep(0.001) #模拟线程执行中出现I/o延迟等 7 num=temp-1 #所有线程对全局变量进行减一 8 9 time.sleep(1) 10 11 num=100 12 l=[] 13 14 for i in range(100): 15

【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收

发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3,添加tag和不添加tag类似其他. 1 package com.example.mysimpleeventbus; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.simple.eventbus.Even