zoukankan      html  css  js  c++  java
  • 信号量,Event, 定时器

    信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,

    from threading import Thread, Semaphore, currentThread
    import time
    
    
    def task():
        se.acquire()
        print('%s is running' % currentThread().getName())
        time.sleep(3)
        se.release()
    
    
    if __name__ == '__main__':
        se = Semaphore(3)  #创建信号量,设置同时几个能拿到锁
        for i in range(20):
            t = Thread(target=task)
            t.start()

    二 Event

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

    from threading import Event
    
    event.isSet():返回event的状态值;
    
    event.wait():如果 event.isSet()==False将阻塞线程;
    
    event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
    
    event.clear():恢复event的状态值为False。

    from threading import Thread, Event, currentThread
    import time,random
    
    def task():
        count = 1
        while not event.is_set():
            if count >= 3:
                print('等待超时', currentThread().getName())
                return
            print('%s尝试当前第%s 次连接' %(currentThread().getName(), count))
            event.wait(0.5)
            count += 1
        print('%s 链接成功' % currentThread().getName())
    
    def check():
        print('正在检查', currentThread().getName())
        time.sleep(random.randint(1, 3))
        event.set()
    
    
    if __name__ == '__main__':
        event = Event()
    
        for i in range(3):
            p = Thread(target=task)
            p.start()
    
        c = Thread(target=check)
        c.start()

    三 定时器

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

    from  threading import Timer
    
    def task():
        print('nihao')
    
    
    if __name__ == '__main__':
        p = Timer(2, task)
        p.start()
  • 相关阅读:
    [转]MFC与Qt的内存管理
    [转]QT项目生成流程例图
    [转]vc中nmake.exe cl.exe 的使用
    android_layout_linearlayout(二)
    android_layout_relativelayout(一)
    android_layout_linearlayout(一)
    android_layout_relativelayout(二)
    android_activity_研究(一)
    两个线程解决一个线程卡之路
    android_layout_framelayout
  • 原文地址:https://www.cnblogs.com/zhengyiqun1992/p/10419534.html
Copyright © 2011-2022 走看看