什么是线程:
线程的特征:
主要方法:
threading.Thread()
t.start()
t.join([timeout])
t.is_alive()
t.setName()
t.getName() 或者 t.name
threading.currentThread()
t.daemon属性
设置方法(两种):
判断属性值
t.isDaemon()
注意: t.daenon要在start前设置,不能和join同用
多线程代码实现实例:
from threading import Thread, currentThread
from time import sleep
import os
a = 100
#线程函数
def test():
global a
a += 10
# 获取当前线程的状态
print("test is_alive:{}".format(currentThread().is_alive()))
# 获取当前线程所在进程的pid
print("{}:{}".format(currentThread().getName(), os.getpid()))
# 用来测试daemon属性的
def test3():
print("进入线程test3...")
# 阻塞等待10秒
sleep(10)
print("我是线程test3!")
#创建线程对象
t1 = Thread(name = "th1", target = test)
t2 = Thread(name = "th2", target = test)
t3 = Thread(target = test3)
t1.start()
t2.start()
# 设置t3线程随主线程退出而退出
t3.setDaemon(True)
t3.start()
sleep(2)
# 主线程所在进程pid
print("main-thread:{}".format(os.getpid()))
# 修改线程名称
t1.setName("new-th1")
print("t1-new-name:"+t1.getName())
# 查看线程状态
print("t1 is_alive:{}".format(t1.is_alive()))
print("t2 is_alive:{}".format(t2.is_alive()))
# 只需要回收t1和t2
t1.join()
t2.join()
print("a = {}".format(a))
运行结果:
gk@gk-vm:~/python/multithreading$ python3 thread_test.py
test is_alive:True
th1:9233
test is_alive:True
th2:9233
进入线程test3...
main-thread:9233
t1-new-name:new-th1
t1 is_alive:False
t2 is_alive:False
a = 120
在这个实例中,一个主线程创建了三个子线程(t3是用来测试daemon属性的),发现可以通过子线程修改主线程中的全局变量a。同时我们发现,主线程和子线程的pid都是一样的,这说明,他们共用一个进程,即:一个进程中包含了多个线程。再看看daemon属性,t3设置daemon为True,我们发现,主线程执行完后,t3线程并没有执行完就退出了。
解决方法: