创建线程的两种方式
其一是继承threading.Thread对象,并覆写其run()方法。run()是线程执行主体。执行该类的start方法可以开启线程。
import threading
from time import sleep
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
sleep(5)
print('This is', self.getName())
if __name__ == '__main__':
t1 = MyThread()
t1.start()
print('main threading...')
输出如下:
main threading...
This is Thread-1
[Finished in 5.3s]
其二是创建一个threading.Thread对象,在构造时传递一个可调用对象给它,一般是一个函数,线程会执行这个函数
import threading
from time import sleep
def print_name():
name = threading.currentThread().getName()
print(name)
sleep(3)
if __name__ == '__main__':
t = threading.Thread(target=print_name)
t.start()
print('main thread...')
关于threading.Thread的join方法和daemon属性
join方法
join方法表示阻塞当前线程,直到目标线程执行结束或返回。修改前面第一个例子,在主线程中等待子线程结束
import threading
from time import sleep
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
sleep(5)
print('This is', self.getName())
if __name__ == '__main__':
t1 = MyThread()
t1.start()
t1.join()
print('main threading...')
输出如下:
This is Thread-1
main threading...
[Finished in 5.3s]
这里主线程调用t1.join后就阻塞了,直到子线程结束(打印出
This
is
Thread
-
1
),然后主线程才继续执行(打印出
main threading
...
)。
而第一个例子中是主线程调用t1.start开启子线程后继续执行自己的逻辑,先打印出
main threading
...
,然后再等待t1线程结束。
区别是:本例的主线程阻塞了自己的执行,等待子线程结束后再执行。而第一个例子的主线程没有阻塞自己的执行,而是执行完后再等待子线程。虽然都等待子线程执行结束,但第一个例子没有因为子线程而阻塞自己的执行。
join还有一个float类型timeout参数,表示等待目标线程多少秒。在这个时间内目标线程没有结束就不管了,本线程继续往后执行。
daemon属性
daemon是个bool值,以前和daemon属性相关的接口是isDaemon()和SetDaemo()方法,前者用来判断,后缀用来设置。现在直接访问daemon就可以了。
新建线程的daemon属性默认为False,如果将一个线程的daemo设置为True,则表示不需要等待这个线程。主线程退出后就退出程序,不过该子线程死活。主线程退出后,子线程只有被迫停止了。
将一个例子再修改一个,将其创建的子线程的daemon设置为True。注意daemon的值只能在调用start之前设置。否则引发异常。
import threading
from time import sleep
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
sleep(5)
print('This is', self.getName())
if __name__ == '__main__':
t1 = MyThread()
t1.daemon = True
t1.start()
print('main threading...')
这次的输出如下:
main threading...
[Finished in 0.3s]
主线程执行完,整个程序就退出了,子线程根本没机会执行打印任务。
第二种创建多线程的方法
参考了下面这篇博文,表示感谢:
python 多线程就这么简单 - 虫师 - 博客园
http://www.cnblogs.com/fnng/p/3670789.html