1.1 获取线程数
import threading
import time
def fun():
time.sleep(1)
print("hello")
t = threading.Thread(target=fun)
t.start()
# print(threading.enumerate())
while True:
leng = len(threading.enumerate())
print("num%d" % leng)
time.sleep(0.2)
1.2 线程共享同一个进程的变量
import threading
num = 1
def fun1():
num = 2
print(num)
fun1()
print(num)
def fun2():
global num
num = 3
print(num)
fun2()
print(num)
def fun3():
global num
num = 4
print(num)
t = threading.Thread(target=fun3)
t.start()
print(num)
1.3 互斥锁
由于线程共享一个进程中的数据,所以在多个线程同时修改某一个共享数据时,会造成数据混乱,基于此,引入互斥锁,来保证
数据的正确性。
import threading
import time
num = 0
def fun1():
global num
for r in range(1000000):
# 加锁,mutex.acquire()默认blocking为True,表示当前线程去获取加锁资源时如果加锁不成功则阻塞直到加锁成功
mutex.acquire()
num += 1
mutex.release()
def fun2():
global num
for r in range(1000000):
mutex.acquire()
num += 1
mutex.release()
mutex = threading.Lock()
t1 = threading.Thread(target=fun1)
t1.start()
# time.sleep(2)
t2 = threading.Thread(target=fun1)
t2.start()
time.sleep(2)
print(num)
锁的好处:确保数据正确性,避免数据混乱
锁的坏处:阻止多线程并发执行,现率降低
可能会造成死锁
思索可以控制线程的执行顺序
import threading
mutex1 = threading.Lock()
mutex2 = threading.Lock()
mutex2.acquire()
mutex3 = threading.Lock()
mutex3.acquire()
mutex4 = threading.Lock()
mutex4.acquire()
def fun1():
while True:
if mutex1.acquire():
print("fun1 do")
mutex2.release()
def fun2():
while True:
if mutex2.acquire():
print("fun2 do")
mutex3.release()
def fun3():
while True:
if mutex3.acquire():
print("fun3 do")
mutex4.release()
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t3 = threading.Thread(target=fun3)
t1.start()
t2.start()
t3.start()
if mutex4.acquire():
print("finish")
1.4 ThreadLocal
通过ThreadLocal声明的变量,只能被变量所属的线程自己访问,实现了线程之间的数据隔离
import threading
import time
local_var = threading.local()
# print(local_var, type(local_var))
def fun1():
local_var.stdo1 = 60
print(local_var.stdo1)
def fun2():
local_var.stdo1 = 100
print(local_var.stdo1)
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t2.start()
time.sleep(1)
t1.start()