threading 模块 Thread 类的用法详解
这篇笔记主要是简化了https://blog.csdn.net/briblue/article/details/85101144
如何理解线程
创建Thread对象有2种方法
直接创建Thread,并通过函数回调处理任务
编写自定义类继承Thread
总结知识
如何给线程赋值名字
如何知道线程是否继续运行
如何提供线程阻塞手段
如何主线程结束的同时子线程也立马结束
1.1创建Thread,并通过函数回调处理任务的方法
这个方法最重要的参数是target,直接上代码
import threading
import time
def test():
for i in range(5):
print('test ',i)
time.sleep(1)
thread = threading.Thread(target=test)
thread.start()
for i in range(5):
print('main ', i)
time.sleep(1)
代码运行结果
test 0
main 0
main 1
main 2
main 3
main 4
test 1
test 2
test 3
test 4
1.2如何给线程赋值名字
我们在 Thread 对象创建时,构造方法里面赋值。
thread = threading.Thread(target=test,name='TestThread')
1.3 如何知道线程是否继续运行
Thread 的 is_alive() 方法查询线程是否还在运行
import threading
import time
def test():
for i in range(5):
print(threading.current_thread().name+' test ',i)
time.sleep(0.5)
thread = threading.Thread(target=test,name='TestThread')
thread.start()
for i in range(5):
print(threading.current_thread().name+' main ', i)
print(thread.name+' is alive ', thread.isAlive())
time.sleep(1)
结果也显而易见,因为子线程sleep时间比主线程的时间短,所以子线程提前结束,主线程还在继续。
TestThread is alive True
TestThread test 1
TestThread test 2
MainThread main 1
TestThread is alive True
TestThread test 3
TestThread test 4
MainThread main 2
TestThread is alive True
MainThread main 3
TestThread is alive False
MainThread main 4
TestThread is alive False
1.4如何提供线程阻塞手段
调用一个 Thread 的 join() 方法,可以阻塞自身所在的线程。
例如:thread.join(1.0)
import threading
import time
def test():
for i in range(5):
print(threading.current_thread().name+' test ',i)
time.sleep(0.5)
thread = threading.Thread(target=test,name='TestThread')
thread.start()
thread.join(1.0)
for i in range(5):
print(threading.current_thread().name+' main ', i)
print(thread.name+' is alive ', thread.isAlive())
time.sleep(1)
运行结果,可见子线程的sleep时间是0.5,join阻塞线程的时间是1,所以子线程的1,2线程被阻塞了,直接从3,4开始。
TestThread is alive True
TestThread test 3
TestThread test 4
MainThread main 1
TestThread is alive True
MainThread main 2
TestThread is alive False
MainThread main 3
TestThread is alive False
MainThread main 4
TestThread is alive False
1.5如何主线程结束的同时子线程也立马结束
其实很简单,只需要在子线程调用 start() 方法之前设置 daemon 就好了。
thread.setDaemon(True)
import threading
import time
def test():
for i in range(5):
print(threading.current_thread().name+' test ',i)
time.sleep(2)
thread = threading.Thread(target=test,name='TestThread')
thread.setDaemon(True)
thread.start()
for i in range(5):
print(threading.current_thread().name+' main ', i)
print(thread.name+' is alive ', thread.isAlive())
time.sleep(1)
运行结果,因为子线程的时间设置为2,比主线程是慢的,所以主线程开始了,子线程还没开始,但主线程结束的同时子线程也结束了
TestThread is alive True
MainThread main 1
TestThread is alive True
TestThread test 1
MainThread main 2
TestThread is alive True
MainThread main 3
TestThread is alive True
TestThread test 2
MainThread main 4
TestThread is alive True
2. 编写自定义类继承Thread
下面的代码,我们自定义了 TestThread 这个类,然后继承 threading.Thread。只有在 run() 中处理逻辑。添加阻塞和进程同时结束的方法也是和上面一样的
import threading
import time
class TestThread(threading.Thread):
def __init__(self,name=None):
threading.Thread.__init__(self,name=name)
def run(self):
for i in range(5):
print(threading.current_thread().name + ' test ', i)
time.sleep(1)
thread = TestThread(name='TestThread')
thread.start()
for i in range(5):
print(threading.current_thread().name+' main ', i)
print(thread.name+' is alive ', thread.isAlive())
time.sleep(1)
来源:CSDN
作者:努力的学渣'#
链接:https://blog.csdn.net/weixin_41598660/article/details/104286106