美文网首页
threading模块

threading模块

作者: 037251a7c483 | 来源:发表于2017-03-27 22:57 被阅读551次

    一、工厂函数

    • threading.active_count()

    • threading.activecount()
      返回当前活动的Thread对象的数量。 返回的计数等于由enumerate()返回的列表的长度。

    • threading.Condition()
      工厂函数,返回一个新的条件变量对象。一个条件变量允许一个或多个线程等待,直到另外一个线程通知他们(他们指这些等待状态的线程)

    • threading.current_thread()

    • threading.currentThread()
      返回当前Thread对象。对应于调用者的线程控制。如果调用者的线程不是通过线程模块创建的,则返回具有有限功能的虚拟线程对象。

    • threading.enumerate()
      返回当前活动的Thread对象的列表。该列表包括守护线程、由current_thread()创建的虚拟线程以及主线程。排除了已经终止的线程和尚未启动的线程

    • threading.Event()
      工厂函数,返回一个新的event对象。event管理可以使用set()方法将其设置为True,使用clear()将其重设置为False,wait()方法则阻塞知道set()将其设置为True

    • threading.Lock()
      工厂函数,返回一个全新的原始锁对象。当一个线程获得锁后,后来的线程想要获得这个锁,需要等到当前线程释放锁

    • threading.RLock()
      工厂函数,获得一个可重入锁。

    • threading.Semaphore([value])
      工厂函数,返回一个新的信号量对象。

    • class threading.local

    • class threading.Timer

    二、Thread类的方法

    控制线程的类,这个类可以以 有限的方式安全的子类化。如果子类重写这个结构,它必须确保在对线程执行任何其他操作之前调用基类构造函数(Thread .__ init __())。

    • start()
      启动一个线程

    • run()
      表示线程的活动,即线程需要做的任务。该方法可以被子类覆写

    • join([timeout])
      等待直到线程终止。即主线程将不会继续运行,而是等待子线程全部终止后才会继续运行

    • getName()
      获取当前线程名

    • setNmae()
      设置线程名

    • isDaemon()

    • setDaemon()
      布尔值,指明这个线程是daemon线程(True)或者不是(False)。这个只能在start()调用之前才能设置否则会抛出RuntimeError异常。因为主线程不是后台线程,因此在主线程中创建的所有子线程默认值都是 False

    • is_alive()
      返回当前线程是否活着。

    四、Event对象

    singal = threading.Event()

    4.1 对象属性

    • is_set()
      当且仅当内部表示为True时返回True。如果set()没有设定,则说明为为False。
    singal = threading.Event
    if not singal.is_set():      #这里没有使用set()方法设置内部标志,因此为False
        singal.wait()
    
    • set()
      设定内部标志为True。所有线程等到它为真时,都会被唤醒。调用了wait()的线程,一旦检测到内部标志位True时,那么都不会继续阻塞了。

    • clear()
      设定内部标识为False。随后,调用wait()的线程都会被阻塞,直到调用set()将内部标志设置为True

    • wait([timeout])
      阻塞线程,知道内部标志设置为True。如果内部标志在入口时为真,则立即返回。 否则,阻塞将持续到另一个线程调用set()将标志设置为true,或直到可选超时发生才会结束。此方法在退出时返回内部标志,因此除非给出超时且操作超时,否则它将始终返回True。

    举一个生产者消费者的例子,生产者生产了一个数据后,然后通知消费者去消费。

    #!/usr/bin/pyhton
    #coding: utf-8
    
    import threading
    import time
    from random import randint
    
    
    def customers(event, lists):
        t = threading.current_thread()
        while 1:
            event.wait()
            if event.is_set():
                try:
                    int = lists.pop()
                    print '{0} is customed by {1}'.format(int, t.name)
                    event.clear()   #阻塞所有线程
                except IndexError:
                    pass
    
    
    def producer(event, lists):
        t = threading.current_thread()
        while 1:
            int = randint(1, 1000)
            lists.append(int)
            print '{0} is produced by {1}'.format(int, t.name)
            event.set()     #唤醒其他线程
            time.sleep(1)    #没有实际意义,为了结果输出时看的清楚点。
    
    def main():
        threads = []
        lists = []
        event = threading.Event()
    
        for name in ('customer1', 'customer2'):
            thread = threading.Thread(target=customers, args=(event, lists))
            threads.append(thread)
            thread.start()
    
        produce_thread = threading.Thread(target=producer, args=(event, lists))
        threads.append(produce_thread)
        produce_thread.start()
    
        for thread in threads:
            thread.join()
    
    if __name__ == '__main__':
        main()
    ---------------------------------------------------------------------------------------------------------
    [root@master server]# python event.py 
    677 is produced by Thread-3
    677 is customed by Thread-2
    898 is produced by Thread-3
    898 is customed by Thread-1
    76 is produced by Thread-3
    76 is customed by Thread-2
    831 is produced by Thread-3
    831 is customed by Thread-1
    947 is produced by Thread-3
    947 is customed by Thread-2
    259 is produced by Thread-3
    259 is customed by Thread-1
    564 is produced by Thread-3
    564 is customed by Thread-2
    746 is produced by Thread-3
    746 is customed by Thread-1
    472 is produced by Thread-3
    472 is customed by Thread-2
    ^C520 is produced by Thread-3
    520 is customed by Thread-1
    

    最后想讲一个自己写socket编程时碰到的一个问题。在多线程中,调用sys.exit(0) 退出的是当前线程,主线程是不会退出的,即阻塞解除前,程序不会退出。

    相关文章

      网友评论

          本文标题:threading模块

          本文链接:https://www.haomeiwen.com/subject/kjabnttx.html