IOT python高级培训(四)

IOT python高级培训(四),第1张

IOT python高级培训(四)

目录

问题

解答

1.    (1)信号量

       (2)条件变量:

       (3)事件:

2.如何使用

(1)信号量

(2)条件变量

(3)事件


问题

首先我们来解决一下一下问题

1.什么是信号量、条件变量、事件

2.如何使用信号量、条件变量、事件

解答 1.    (1)信号量:

        用于设置多线程同时可运行的线程数

       (2)条件变量:

         condition被称为条件变量,其中还包括lock的acquire和release以及wait和notify方法。简单            来 讲线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条              件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态 的线              程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

       (3)事件:

        用于主线程控制其他线程的执行,事件是一个简单的线程同步对象,其主要提供以下                  的几个方法:clear将flag设置为 False
        set将flag设置为 True
        is_set判断是否设置了flag
       wait会一直监听flag,如果没有检测到flag就一直处于阻塞状态
       事件处理的机制:全局定义了一个Flag,
       当Flag的值为False,那么event.wait()就会阻塞,
       当flag值为True,那么event.wait()便不再阻塞

2.如何使用 (1)信号量
def run(n,x):
    semaphore.acquire()#信号获取
    print(n)
    time.sleep(x)
    semaphore.release()
if __name__ == '__main__':
    semaphore=threading.Semaphore()#信号量实体化
    for i in range(5):
        t=threading.Thread(target=run,args=(i,i))#多线程工作target指所用函数args指传递参数相当于run(i,i)
        t.start()
(2)条件变量
"""
条件变量
互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持
"""
import threading
import time
def run(x):
    con.acquire()#相当于开始了
    print(f'线程{x}')
    con.notify()#让等待的进程进行唤醒
    print(f'线程{x}挂起')
    con.wait()
    con.notify()
    time.sleep(1)
    print(f'线程{x}在此启动')
    con.release()
if __name__ == '__main__':
    con = threading.Condition()#实例化
    # for i in range(50):
    #     t=threading.Thread(target=run,args=(i,))
    #     t.start()
    t1=threading.Thread(target=run,args=(1,))
    t2 = threading.Thread(target=run, args=(1,))
    t1.start()
    t2.start()
(3)事件
"""
事件
"""
import threading
import time


def car():
    while  True:
        if event.is_set():
            print('小车行驶')
        else:
            print('没有行驶')

def set_event():
    while True:
        event.set()
        time.sleep(1)
        event.clear()
        time.sleep(1)

if __name__ == '__main__':
    event=threading.Event()
    car1=threading.Thread(target=car)
    car1.start()
    set_e=threading.Thread(target=set_event)
    set_e.start()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存