Threading模块
python中的多线程主要有两个模块,thread模块和threading模块,相比较thread而言threading模块对线程支持更完善,有更多的同步原语,thread更底层,threading更加常用。所以着重介绍threading模块。
Thread类
Thread类属性:
属性 | 描述 |
---|---|
name | 线程名 |
ident | 线程标识符 |
daemon | 布尔值,表示这个线程是否守护线程 |
Thread类方法
函数 | 描述 |
---|---|
__init__(group=None, target=None,name=None,args=(),kwargs={},verbose=None,daemon=None | 实例化一个线程对象,需要一个可调用的target对象,以及参数args或者kwargs。还可以传递name和group参数。daemon的值将会设定thread.daemon的属性. |
start() | 开始线程的执行 |
run() | 定义线程的功能的函数(一般会被子类重写) |
join( t i m e o u t \mathit{timeout } timeout= None) | 程序挂起,知道线程结束;如果给了timeout,则最多阻塞timeout秒 |
getName() | 返回线程的名字 |
setName() | 设置线程的名字 |
isAlive() | 布尔标志,表示这个线程是否还在运行中 |
isDaemon() | 返回线程的daemon标志 |
setDaemon( d a e m o n i c \mathit{daemonic} daemonic) | 把线程的daemon标志设为daemonic(一定要在调用start()函数前调用) |
创建线程的三种方式
1)创建一个Thread的实例,传给它一个函数:
import time
import threading
def func(n):
while n > 0:
print("线程name:", threading.current_thread().name, "参数n:", n)
n -= 1
time.sleep(1)
# 实例化一个Thread对象,传递函数和参数
t = threading.Thread(target=func, args=(5,))
t.start()
print("主线程:", threading.current_thread().name)
2)创建一个Thread的实例,传给它一个可调用的类对象
import time
import threading
class myThreadfunc(object):
def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args
# 调用self.func的同时传入self.args
def __call__(self):
self.func(*self.args)
def loop(n):
while n>0:
print('线程name:', threading.current_thread().name, '参数:', n)
n -= 1
time.sleep(1)
# 实例化Thread对象的同时,调用了传入的func函数(就是loop),
#又使用传入的参数args((5,))当作func函数的参数
t = threading.Thread(target=myThreadfunc(loop, (5, ), loop.__name__))
t.start()
print('主线程:',threading.current_thread().name)
3)从Thread派生出一个子类,创建一个这个子类的实例(常用)
import time
import threading
class myThreadfunc(threading.Thread):
# 子类构造函数必须先调用父类的构造函数
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
# 重写run()方法代替__call__()方法
def run(self):
self.func(*self.args)
def loop(n):
while n>0:
print('线程name:',threading.current_thread().name, '参数:',n)
n -= 1
time.sleep(1)
t = myThreadfunc(loop, (5,), loop.__name__)
t.start()
print('主线程:',threading.current_thread().name)