线程有五种状态 新建、就绪、运行、阻塞、死亡。 阻塞有三种情况:
同步阻塞是指处于竞争锁定的状态,线程请求锁定时将进入这个状态,一旦成功获得锁定又恢复到运行状态;
等待阻塞是指等待其他线程通知的状态,线程获得条件锁定后,调用“等待”将进入这个状态,一旦其他线程发出通知,线程将进入同步阻塞状态,再次竞争条件锁定;
而其他阻塞是指调用time.sleep()、anotherthread.join()或等待io时的阻塞,这个状态下线程不会释放已获得的锁定。
python提供了两种使用线程的方式,一种是函数式的,一种是类包装的。 * thread * threading 1、thread:
>>> import thread
>>> dir(thread)
[‘locktype’, ‘__doc__’, ‘__name__’, ‘__package__’, ‘_count’, ‘_local’, ‘allocate’, ‘allocate_lock’, ‘error’, ‘exit’, ‘exit_thread’, ‘get_ident’, ‘interrupt_main’, ‘stack_size’, ‘start_new’, ‘start_new_thread’]
thread.start_new_thread ( function , args [ , kwargs ] ) 调用thread模块中的start_new_thread()函数来产生新的线程。 2、threading:
>>> import threading
>>> dir(threading)
[‘boundedsemaphore’, ‘condition’, ‘event’, ‘lock’, ‘rlock’, ‘semaphore’, ‘thread’, ‘threaderror’, ‘timer’, ‘_boundedsemaphore’, ‘_condition’, ‘_dummythread’, ‘_event’, ‘_mainthread’, ‘_rlock’, ‘_semaphore’, ‘_timer’, ‘_verbose’, ‘_verbose’, ‘__all__’, ‘__builtins__’, ‘__doc__’, ‘__file__’, ‘__name__’, ‘__package__’, ‘_active’, ‘_active_limbo_lock’, ‘_after_fork’, ‘_allocate_lock’, ‘_counter’, ‘_enumerate’, ‘_format_exc’, ‘_get_ident’, ‘_limbo’, ‘_newname’, ‘_picksomenondaemonthread’, ‘_profile_hook’, ‘_shutdown’, ‘_sleep’, ‘_start_new_thread’, ‘_sys’, ‘_test’, ‘_time’, ‘_trace_hook’, ‘activecount’, ‘active_count’, ‘currentthread’, ‘current_thread’, ‘deque’, ‘enumerate’, ‘local’, ‘setprofile’, ‘settrace’, ‘stack_size’, ‘warnings’]>>> dir(threading.thread)
[‘_thread__bootstrap’, ‘_thread__bootstrap_inner’, ‘_thread__delete’, ‘_thread__exc_clear’, ‘_thread__exc_info’, ‘_thread__initialized’, ‘_thread__stop’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__doc__’, ‘__format__’, ‘__getattribute__’, ‘__hash__’, ‘__init__’, ‘__module__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’, ‘_block’, ‘_note’, ‘_reset_internal_locks’, ‘_set_daemon’, ‘_set_ident’, ‘daemon’, ‘getname’, ‘ident’, ‘isalive’, ‘isdaemon’, ‘is_alive’, ‘join’, ‘name’, ‘run’, ‘setdaemon’, ‘setname’, ‘start’]
threading 模块提供的常用方法:
threading.currentthread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activecount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
继承threading.thread方法,重写run方法。 threading.thread类的初始化函数原型:def __init__(self, group=none, target=none, name=none, args=(), kwargs={}) 参数group是预留的,用于将来扩展; 参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行; 参数name是线程的名字。默认值为“thread-n“,n是一个数字。 参数args和kwargs分别表示调用target时的参数列表和关键字参数。 join()方法,调用该方法的线程将等待直到该thread对象完成,再恢复运行。 调用thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。 threading.lock对象:mutex,有acquire()和release()方法 rlock允许在同一线程中被多次acquire。而lock却不允许这种情况。注意:如果使用rlock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。 threading.condition对象:condition variable,建立该对象时,会包含一个lock对象(因为condition variable总是和mutex一起使用)。可以对condition对象调用acquire()和release()方法,以控制潜在的lock对象。
condition.wait([timeout]): wait方法释放内部所占用的琐,同时线程被挂起,直至接收到通知被唤醒或超时(如果提供了timeout参数的话)。当线程被唤醒并重新占有琐的时候,程序才会继续执行下去。
condition.notify(): 唤醒一个挂起的线程(如果存在挂起的线程)。注意:notify()方法不会释放所占用的琐。
condition.notifyall() 唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的琐。