Python多线程初步
Posted 善良超锅锅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多线程初步相关的知识,希望对你有一定的参考价值。
创建线程的两种方式
其一是继承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...')
这里主线程调用t1.join后就阻塞了,直到子线程结束(打印出 This is Thread - 1 ),然后主线程才继续执行(打印出 main threading ... )。 而第一个例子中是主线程调用t1.start开启子线程后继续执行自己的逻辑,先打印出 main threading ... ,然后再等待t1线程结束。This is Thread-1
main threading...
[Finished in 5.3s]
区别是:本例的主线程阻塞了自己的执行,等待子线程结束后再执行。而第一个例子的主线程没有阻塞自己的执行,而是执行完后再等待子线程。虽然都等待子线程执行结束,但第一个例子没有因为子线程而阻塞自己的执行。
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
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系
以上是关于Python多线程初步的主要内容,如果未能解决你的问题,请参考以下文章