• threading模型


    ***************************************************************************************模型--蹲坑(Semaphore)**********************************************************************

    import threading
    import time
    import random

    '''
    ---------------------

    先是判断,如果没有加锁然后设置了超时时间,抛出ValueError;
    循环,如果value == 0,没有加锁或在超时时间内,跳出循环;
    否则,调用Condition变量wait函数等待通知或超时;
    如果value不为0,跳出循环执行else里的代码,信号量-1,rc = ture,
    代表可以调用release函数,最后返回rc;
    信号量+1,然后调用Condition变量的notify唤醒一个线程~
    剩下的_enter_和_exit_就不用说了,重写这两个方法就能直接用with关键字了
    '''
    s = threading.Semaphore(5) # 粪坑

    class Human(threading.Thread):
    def run(self):
    #with s:
    s.acquire() # 占坑
    print("拉屎拉屎 - " + self.name + " - " + str(time.ctime()))
    time.sleep(random.randrange(1, 3))
    print("拉完走人 - " + self.name + " - " + str(time.ctime()))
    s.release() # 走人


    if __name__ == '__main__':
    for i in range(10):
    human = Human()
    human.start()

    *****************************************************************模型--公司旅游(Barrier)*****************************************************************************************************

    import threading
    import time
    import random

    '''
    ---------------------

    BrokenBarrierError:RuntimeError的子类,当栅栏被reset()或broken时引发;

    例子:公司一起去旅游
    '''
    class Staff(threading.Thread):
    def __init__(self, barriers):
    #threading.Thread.__init__(self)
    super().__init__()
    self.barriers = barriers

    def run(self):
    print("员工 【" + self.name + "】" + "出门")
    time.sleep(random.randrange(1, 10))
    print("员工 【" + self.name + "】" + "已签到")
    self.barriers.wait()

    def ready():
    print(threading.current_thread().name + ":人齐,出发,出发~~~")


    if __name__ == '__main__':
    print("要出去旅游啦,大家快集合~")
    #barrier屏障
    b = threading.Barrier(10, action=ready, timeout=20)
    for i in range(10):
    staff = Staff(b)
    staff.start()

    ********************************************************************模型--红绿灯(Event)*********************************************************************************************

    import threading
    import time
    import random

    '''
    ---------------------

    判断标志是否为False,False的话进入堵塞状态,(⊙v⊙)嗯
    源码就那么简单,感觉看完还是蒙圈不知道怎么用,写个简单的例子?
    汽车过红绿灯的例子
    '''
    class CarThread(threading.Thread):
    def __init__(self, event):
    threading.Thread.__init__(self)
    self.threadEvent = event

    def run(self):
    # 休眠模拟汽车先后到达路口时间
    time.sleep(random.randrange(1, 10))
    print("汽车 - " + self.name + " - 到达路口...")
    self.threadEvent.wait()
    print("汽车 - " + self.name + " - 通过路口...")


    if __name__ == '__main__':
    light_event = threading.Event()

    # 假设有20台车子
    for i in range(20):
    car = CarThread(event=light_event)
    car.start()

    while threading.active_count() > 1:
    light_event.clear()
    print("红灯等待...")
    time.sleep(3)
    print("绿灯通行...")
    light_event.set()
    time.sleep(2)

    *****************************************************************************************模型--生产者消费者(Condition)************************************************************************************************

    # -*- coding:utf-8 -*-
    import threading
    import time

    '''
    Condition(条件变量)除了提供与Lock类似的acquire()与release()函数外,还提供了
    wait()与notify()函数
    1.调用threading.Condition获得一个条件变量对象;
    2.线程调用acquire获得Condition对象;
    3.进行条件判断,不满足条件调用wait函数,满足条件,进行一些处理改变
    条件后,调用notify函数通知处于wait状态的线程,重新进行条件判断。
    '''

    num = 0
    con = threading.Condition()

    class Producer(threading.Thread):
    """生产者"""
    def run(self):
    global num
    # 获取锁
    con.acquire()
    while True:
    num += 1
    print('生产了1个,现在有{0}个'.format(num))
    time.sleep(1)
    if num >= 5:
    print('已达到5个,不再生产')
    # 唤醒消费者
    con.notify()
    # 等待-释放锁;被唤醒-获取锁
    con.wait()
    # 释放锁
    print('Producer释放锁')#没执行
    con.release()


    class Customer(threading.Thread):
    def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.money = 7

    def run(self):
    global num
    while self.money > 0:
    # 由于场景是多个消费者进行抢购,如果将获取锁操作放在循环外(如生产者),
    # 那么一个消费者线程被唤醒时会锁住整个循环,无法实现另一个消费者的抢购。
    # 在循环中添加一套"获取锁-释放锁",一个消费者购买完成后释放锁,其他消费者
    # 就可以获取锁来参与购买。
    con.acquire()
    if num <= 0:
    print('没货了,{0}通知生产者'.format(self.name))
    #唤醒生产者
    con.notify()
    #等待
    con.wait()
    self.money -= 1
    num -= 1
    print('{0}消费了1个, 剩余{1}个'.format(
    threading.current_thread().name, num))
    time.sleep(1)
    con.release()
    time.sleep(1)
    print('{0}没钱了-回老家'.format(threading.current_thread().name))

    if __name__ == '__main__':
    p = Producer(daemon=True)
    c1 = Customer(name='Customer-1')
    c2 = Customer(name='Customer-2')
    p.start()
    c1.start()
    c2.start()
    c1.join()
    c2.join()

    *****************************************************************************模型--时间(Timer)*************************************************************************************

    import threading
    import time


    def skill_ready():
    print("!!!!!!大招已经准备好了!!!!!!")


    if __name__ == '__main__':
    t = threading.Timer(5, skill_ready)
    t.start()
    while threading.active_count() > 1:
    print("======大招蓄力中======")
    time.sleep(1)

  • 相关阅读:
    前端基础 — BOM和DOM
    JavaScript概述
    前端知识 — HTML内容、CSS基础
    数据库MySQL
    jquery ajax() 方法使用
    移动端自适应的问题及解决
    jquery appendTo 和 append 的用法
    css 截取文字
    电脑模拟手机工具
    jquery 旋转插件jqueryrotate
  • 原文地址:https://www.cnblogs.com/cwx-0324/p/10194250.html
Copyright © 2020-2023  润新知