IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]14.1 threading--多线程

    caimouse发表于 2016-06-30 08:29:06
    love 0

    14. 并行执行库

    本库主要提供了并行执行多任务的功能,将提供一些工具来给不同的任务来选择,比如是CPU密集的任务,就需要使用多线程的工具,而是IO密集型的任务,就需要选择事件驱动的工具。

    14.1 threading--多线程

    本模块提供了线程的高级操作接口。

    threading.active_count()

    返回当前有多少个活动的线程个数。

     

    threading.current_thread()

    返回当前线程对象。

     

    threading.get_ident()

    返回当前线程标识整数。

     

    threading.enumerate()

    返回当所有活动的线程列表。包括守护线程、临时线程、主线程。

     

    threading.main_thread()

    返回主线程对象,正常情况下它就是解释器启动的线程。

     

    threading.settrace(func)

    设置一个跟踪函数到线程。

     

    threading.setprofile(func)

    设置配置函数到线程。

     

    threading.stack_size([size])

    设置线程使用堆栈的大小。如果使用默认值,设置size为0。如果设置超出系统的支持,会抛出异常RuntimeError。

     

    threading.TIMEOUT_MAX

    获取锁或等待函数的最大超时时间,比如调用函数Lock.acquire()、RLock.acquire()、Condition.wait()等等。如果指定的超时时间大于此值,就会抛出异常OverflowEror。

     

    class threading.local

    一个类表示线程本地数据。

    例子:

    mydata = threading.local()

    mydata.x = 1

     

    class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

    线程的构造函数。参数group是保留的参数,为将来实现线程组的功能,默认为None。参数target是将在函数run()调用的函数,默认为None。参数name是线程名称。参数args是目标调用的函数参数;参数kwargs是目标调用的字典参数。

     

    start()

    开始启动线程。

     

    run()

    线程运行的主函数。可以继承线程类重载这个函数。

     

    join(timeout=None)

    等待线程退出。如果有超时参数,当超时到达时,就不再等待。时间单位为秒,可以输入小数。

     

    name

    线程标识用的名称。

     

    getName()

    setName()

    旧的兼容设置线程名称的函数,直接使用name属性。

     

    ident

    线程的整数标识数字,如果退出线程再创建时可能重复这个数字。

     

    is_alive()

    返回线程是否还存活的标志。

     

    daemon

    是否是守护线程的标志,如果是返回True,否则返回False。

     

    isDaemon()

    setDaemon()

    旧的设置守护线程标志的函数,直接使用属性代替。

     

    class threading.Lock

    本类实现基本线程锁对象。一旦线程获取锁,直接释放锁之后别的线程才可以进入。

    acquire(blocking=True, timeout=-1)

    获取线程锁。当参数blocking设置为True时,直到获取到锁成功才返回;当参数blocking设置为False时,不进行阻塞,调用之后立即返回。如果当设置锁成功,返回True,设置锁不成功返回False。参数timeout是设置阻塞超时间,以秒为单位的小数。

     

    release()

    释放锁,可以从任何线程来释放之前锁住的锁。然后设置锁为无锁状态,允许之前等待之中的一个线程再次获取锁。如果调用此函数之前没有执行任何获取锁的动作,就立即抛出异常RuntimeError。

     

    class threading.RLock

    本类实现了可重入锁对象。可重入的锁,必须由它获取的线程来释放。使用本锁时意味着同一个线程是可以重新进入,也就是可以递归进入锁。

     

    acquire(blocking=True, timeout=-1)

    获取锁。当获取时,可以阻塞也可以不阻塞的方式。

     

    release()

    释放可以重入的锁。

     

    class threading.Condition(lock=None)

    本类实现的条件锁。实现了一个条件可以多个线程等待成立,如果不成立,就等待,如果成立了就通知别的线程。参数lock是一个锁或者重入锁对象。

     

    acquire(*args)

    获取条件变量的锁。如果成功返回就可以操作相应的变量。

     

    release()

    释放已经获取了条件变量的锁。

     

    wait(timeout=None)

    等待到通知或者时间超时。

     

    wait_for(predicate, timeout=None)

    等到条件成为真才往下执行。参数predicate是一个可调用对象,返回布尔值;参数timeout是超时时间。

     

    notify(n=1)

    通知等这个条件的线程唤醒。

     

    notify_all()

    通知所有等这个条件的线程唤醒。

     

    class threading.Semaphore(value=1)

    本类实现的信号量管理。参数value是表示拥有多少个信号量。

     

    acquire(blocking=True, timeout=None)

    获取一个信号量。

     

    release()

    释放一个信号量。

     

    class threading.Event

    本类实现事件管理。一个线程可以设置一个事件让另外一个线程来等待,当事件发生时另外线程作出响应。

     

    is_set()

    当事件有信号时返回True。

     

    set()

    设置事件有信号。

     

    clear()

    清空事件的信号。

     

    wait(timeout=None)

    等待事件的信号出现。

     

    class threading.Timer(interval, function, args=None, kwargs=None)

    线程定时器类,用线程来实现定时执行任务的功能。参数interval是定时的时间,单位为秒;参数function是定时线程到达时调用执行的函数对象;参数args是传送给前面函数的参数;参数kwargs是传送给前面函数的参数。

     

    cancel()

    停止定时器,或者取消定时器执行。

     

    class threading.Barrier(parties, action=None, timeout=None)

    创建一个栅栏对象。可以让多个线程可以到同一个时间同步开始执行。参数parties是表示多少个线程同步;参数action是所有线程可以执行时调用对象;参数timeout是等待同步超时的时间。

     

    wait(timeout=None)

    等待栅栏信号。

     

    reset()

    清空栅栏信号。

     

    abort()

    放弃栅栏信号,会导致所有等待的线程退出。

     

    parties

    有多少个线程需要等待。

     

    n_waiting

    当前已经有多少个线程等待。

     

    broken

    标记状态是否到达,如果已经到达返回True。

     

    exception threading.BrokenBarrierError

    当栅栏复位或者到达,抛出异常。

     

    多线程的例子:

    #python 3.4
    import threading
    from time import ctime,sleep
     
    def music(func):
        for i in range(2):
            print("I was listening to %s. %s" %(func,ctime()))
            sleep(1)
     
    def move(func):
        for i in range(2):
            print("I was at the %s! %s" %(func,ctime()))
            sleep(5)
     
    threads = []
    t1 = threading.Thread(target = music, args = (u'真的爱你',))
    threads.append(t1)
    t2 = threading.Thread(target = move, args = (u'捉妖记',))
    threads.append(t2)
     
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
     
        print("all over %s" %ctime())


    结果输出如下:

    >>>

    I was listening to 真的爱你. Wed Mar 23 11:06:43 2016I was at the 捉妖记! Wed Mar 23 11:06:43 2016all over Wed Mar 23 11:06:43 2016

     

     

    >>> I was listening to 真的爱你. Wed Mar 23 11:06:44 2016

    I was at the 捉妖记! Wed Mar 23 11:06:48 2016

     

    蔡军生  QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接