线程模块
本文主要学习的线程模块是在 python3.7 版本环境中的 threading 模块,不涉及另外的一个线程模块 _thread。
线程模块中的属性和方法:
import threading
dir(threading) # 下面列表为返回数据
['Barrier', 'BoundedSemaphore', 'BrokenBarrierError', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'TIMEOUT_MAX', 'Thread', 'ThreadError', 'Timer', 'WeakSet', '_CRLock', '_DummyThread', '_MainThread', '_PyRLock', '_RLock', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_count', '_counter', '_dangling', '_deque', '_enumerate', '_format_exc', '_islice', '_limbo', '_main_thread', '_newname', '_os', '_pickSomeNonDaemonThread', '_profile_hook', '_set_sentinel', '_shutdown', '_start_new_thread', '_sys', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'enumerate', 'get_ident', 'local', 'main_thread', 'setprofile', 'settrace', 'stack_size']
常用类:
threading.Thread
常用方法:
threading.enumerate()
返回一个包含正在运行的线程的列表(主线程和子线程),正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.Thread类中方法
run方法:线程启动后,自动执行该方法
类实例方法:
start:开启线程
join:等待线程结束
线程创建
线程创建所用类为threading.Thread,有两种方法:1、直接创建,2、创建新类,继承threading.Thread类,重写run方法
代码实现1,直接创建线程
import threading
import time
def t1(t):
for i in t:
print(i)
time.sleep(1)
def t2(t):
for i in t:
print(i)
time.sleep(1)
def main():
t11 = threading.Thread(target=t1, args=([1, 2, 3],))
t22 = threading.Thread(target=t2, args=([4, 5, 6],))
#print(id(t11))
#print(id(t22))
t11.start()
t22.start()
while True:
print(threading.enumerate())
if len(threading.enumerate()) <= 1:
break
time.sleep(0.5)
if __name__ == '__main__':
main()
可以发现,t11和t22两个线程是同时运行(并发)的,多次执行后 发现:cpu交替执行两个线程,二者的先后顺序是不确定(随机)的,多线程可以共享全局变量。
代码实现2,类继承与方法重写
import threading, time
ct = 1
class T(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
global ct
for i in range(3):
ct = ct+1
time.sleep(0.5)
print(ct)
if __name__ == '__main__':
t = T()
t.start()
t.join()
print('end.')
从上面代码可以看到,join方法会等待子线程结束,再执行主线程的print方法,所以join方法可以在一定程度上 使代码顺序执行。
线程执行顺序
这里的执行顺序指的是 主线程和子线程的执行顺序。
通常情况下,主线程会等待子线程执行,当所有子线程结束后,主线程才会继续后面的操作 直到结束,也可以人为改变这个顺序,即主线程无需等待子线程结束,实现的方法是 设置守护线程。
def demo():
for i in range(3):
print("hello world")
time.sleep(1)
if __name__ == '__main__':
t = threading.Thread(target=demo)
# 守护线程,不会等子线程结束
t.setDaemon(True)
t.start()
print('end.')