Python 多线程的运用
为了让萌新们更好的理解什么是多线程,在开始前,我们先来看看下面这段代码:
import time
import datetime
def dotask():
while True:
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(5)
def main():
print('main function.')
dotask()
main()
dotask 函数的作用是,每隔5秒钟打印当前时间。可是,发现没有,main函数没有被执行,原因是dotask中有无限循环。那有没有什么方法,让dotask在后台执行,不影响我们执行后面的代码呢。
这就是多线程的作用了。
要完完整整的来解释什么是多线程,那可费功夫了,对理论知识有兴趣的朋友们可以去问问度娘,这里我就不讲解了,我们直接上代码,让大家更直观的理解什么是多线程。
在python中创建多线程,有多种方法,这里我们使用threading这个内置库。
threading.Thread(target=FuncName)
上述代码将返回一个线程实例,target参数是一个函数地址,其实还有很多其它参数,后面会说,这里先不管。
我们来改改开头的代码,使用线程来执行dotask函数。
import time
import datetime
import threading
def dotask():
while True:
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(5)
def main():
print('main function.')
t = threading.Thread(target=dotask)
t.start()
main()
main函数被执行了,并且dotask函数在main函数执行后还在后台执行,每隔5秒打印当前时间。
线程创建方法 1
import threading
t=threading.Thread(target=func)
t.start()
前文就是使用这种方法实现的。
线程创建方法 2
以继承类的方式创建:
import time
import datetime
import threading
class timer(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
while True:
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(5)
def main():
print('main function.')
t = timer()
t.start()
main()
多线程的创建
thread_list = []
thread_count = 5
for i in range(thread_count):
t = threading.Thread(target=dotask)
thread_list.append(t)
t.start()
设置和获得线程名称
- 在实例化的时候指定名称
t=threading.Thread(name='线程名称')
- 通过实例来设定
t.name='线程名称' t.setName('线程名称')
启动线程和结束线程
启动线程:
t.start()
线程在执行完代码后会自动退出,但像上文中的循环需要做特殊的处理,让循环可控。
TERMINATE = True
def dotask():
while not TERMINATE:
pass
判断线程是否存活
t.isAlive()
线程还在执行返回True,否则返回False。
守护线程
设置守护线程:
t.daemon = True
t.setDaemon(True)
主线程默认不是守护线程,因此基于主线程创建的所有线程默认daemon均为False,当没有生存的非守护线程时,整个程序将会退出。简单的说,如果设置成守护线程,基于此线程创建的子线程在此线程结束时均停止。
需要注意的是,设置守护线程只能在线程开始前。
获取daemon状态:
t.isDaemon()
返回True表示为守护线程。
阻塞线程
t.join()
获得当前进程的线程数
import threading
count = threading.activeCount()
通常这个数 >= 2.
获得正在运行的线程
import threading
thread_running_list = threading.enumerate()
会返回一个包含正在运行的线程List。不包含运行前和结束后的线程。
总结
线程的应用其实很简单,本文都是一些简单的功能;将来大家还要学习线程安全,线程同步和异步,线程的通讯,线程的优先级,线程池等。