14. 并行执行库
本库主要提供了并行执行多任务的功能,将提供一些工具来给不同的任务来选择,比如是CPU密集的任务,就需要使用多线程的工具,而是IO密集型的任务,就需要选择事件驱动的工具。
本模块提供了线程的高级操作接口。
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 深圳