成后不用管子线程是否运行完都退出,就要设置setDaemon(True)
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print('ok')
time.sleep(2)
print('end')
t1=MyThread()#创建线程对象
t1.setDaemon(True)
t1.start()#激活线程对象
print('end again')
#运行结果是马上打印ok和 end again
#然后程序终止,不会打印end
主线程默认是非守护线程,子线程都是继承的主线程,所以默认也都是非守护线程
5.其他方法其他方法
isAlive(): 返回线程是否处于活动中
getName(): 返回线程名
setName(): 设置线程名
threading.currentThread():返回当前的线程变量
threading.enumerate():返回一个包含正在运行的线程的列表
threading.activeCount():返回正在运行的线程数量
三、各种锁三、各种锁
1.同步锁(用户锁,互斥锁)同步锁(用户锁,互斥锁)
先来看一个例子:
需求是有一个全局变量的值是100,我们开100个线程,每个线程执行的操作是对这个全局变量减一,最后import threading
import threading
import time
def sub():
global num
temp=num
num=temp-1
time.sleep(2)
num=100
l=[]for i in range(100):
t=threading.Thread(target=sub,args=())
t.start()
l.append(t)
for i in l:
i.join()
print(num)
好像一切正常,现在我们改动一下,在sub函数的temp=num,和num=temp-1 中间,加一个time.sleep(0.1),会发现出问题了,
结果变成两秒后打印99了,改成time.sleep(0.0001)呢,结果不确定了,但都是90几,这是怎么回事呢?
这就要说到Python里的那把GIL锁了,我们来捋一捋: