1,线程的基本使用

import threading

print('666')
def func(arg):
    print(arg)

t = threading.Thread(target=func,args=(1,))
t.start()

print('end')
View Code

2,主线程默认等子线程执行完毕

import threading
import time
def func(arg):
    time.sleep(arg)
    print(arg)

t1 = threading.Thread(target=func,args=(3,))
t1.start()

t2 = threading.Thread(target=func,args=(4,))
t2.start()

print(123)
View Code

3,主线程不再等,主线程终止则所有子线程终止  *****

import time
import threading

def func(arg):
    time.sleep(2)
    print(arg)

t1 = threading.Thread(target=func,args=(3,))
t1.setDaemon(True)
t1.start()

t2 = threading.Thread(target=func,args=(5,))
t2.setDaemon(True)
t2.start()

print(123)
View Code

4,开发者可以控制主线程等待子线程(最多等待时间)

import threading
import time
def func(arg):
    time.sleep(0.1)
    print(arg)

print('创建子线程t1')
t1 = threading.Thread(target=func,args=(3,))
t1.start()
t1.join(2) #无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走
           #有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走
print('创建子线程t2')
t2 = threading.Thread(target=func,args=(5,))
t2.start()
t2.join(2)

print(123)
View Code

5,线程名称

import threading
def func(arg):
    t = threading.current_thread() #获取当前执行该函数的线程对象
    name = t.getName()  #根据当前线程对象获取当前线程名称
    print(name,arg)

t1 = threading.Thread(target=func,args=(11,))
t1.setName('t1线程')  #设置名字
t1.start()

t2 = threading.Thread(target=func,args=(22,))
t2.setName('t2线程')
t2.start()

print(123)
View Code

6,多线程加锁

import time
import threading

lock = threading.RLock()
n = 10

def task(i):
    print('这段代码不加锁',i)  #全部读取到这里后被锁拦截

    lock.acquire()  #加锁,此区域的代码同一时刻只能有一个线程执行
    global n
    print('当前线程',i,'读取到的n为',n)
    n = i
    time.sleep(1)
    print('当前线程',i,'修改n值为:',n)
    lock.release()  #释放锁
    
for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()
View Code