ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python深度培训笔记四

2022-01-10 10:32:14  阅读:132  来源: 互联网

标签:__ 培训 Python acquire 笔记 threading 线程 Event con


目录

一、信号量

1.什么是信号量?

2.怎么实现?

二、条件变量

1.什么是条件变量?

2.怎么实现?

三、事件

1.什么是事件?

2.怎么实现?


一、信号量

1.什么是信号量?

信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。

2.怎么实现?

threading模块里的Semaphore类,实现了信号量对象,可用于控制获取资源的线程数量。所具有的acquire()和release()方法,可以用with语句的上下文管理器。当进入时,将调用acquire()方法,当退出时,将调用release()。

#信号量
import threading
import time

def run(n,x):
    semaphore.acquire()
    print(n)
    time.sleep(x)
    semaphore.release()




if __name__ == '__main__':
    semaphore = threading.Semaphore(5)#同时执行5个线程
    for i in range(16):
        t = threading.Thread(target=run,args=(i,i))
        t.start()

二、条件变量

1.什么是条件变量?

Python 提供的 Condition 对象提供了对复杂线程同步问题的支持。 Condition 被称为条件变量,除了提供与 Lock 类似的 acquire 和 release 方法外,还提供了 wait 和 notify 方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

2.怎么实现?

线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。
 

#条件变量
import threading
import time


def run(x):
#    lock.acquire()
    con.acquire()
    print(f'线程{x}')
    con.notify()
    print(f'线程{x}挂起')
    con.wait()
    time.sleep(1)
    print(f'线程{x}再次启动')
    con.notify()
    con.release()
#    lock.release()

def run2(x):

    con.acquire()
    print(f'线程{x}')
    con.notify()
    print(f'线程{x}挂起')
    con.wait()
    time.sleep(1)
    print(f'线程{x}再次启动')
    con.notify()
    con.release()


if __name__ == '__main__':
    lock=threading.RLock()
    con=threading.Condition()
#     for i in range(10):
#       t = threading.Thread(target=run,args=(i,))
#       t.start()
    t1=threading.Thread(target=run,args=(1,))
    t1.start()
    t1=threading.Thread(target=run,args=(1,))
    t1.start()

三、事件

1.什么是事件?

Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。

事件的工作机制:在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。
 

2.怎么实现?

set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。

clear(): 将标志设为False。

wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。

isSet(): 获取内置标志状态,返回True或False。
 

#事件
import threading
import time


def car():
    while True:
        if event.is_set():
            print('小车行驶')
        else:
            print('小车停止')
            event.wait()


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()

标签:__,培训,Python,acquire,笔记,threading,线程,Event,con
来源: https://blog.csdn.net/weixin_54446335/article/details/122403970

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有