本博文源于python基础炫酷技能,主要讲述python的线程的问题。大家学到多线程的时候只要搞明白两种东西即可,第一线程通信,另一个叫做线程冲突。本博文就以一种打印数字的方法浅析线程冲突的解决方案!
线程冲突起因
例子:多线程累加数据到5百万
没使用多线程之前
实验效果
实验代码
import _thread
import time
num = 0
def add():
global num
for i in range(1000000):
num += 1
print(num)
for i in range(5):
add()
这里的代码非常直观和浅显,大家应该都能理解
使用多线程出现的冲突
实验效果
实验代码
这里就调用了python的包,结果发现操作数据出现乱序的效果
import _thread
import time
num = 0
def add():
global num
for i in range(1000000):
num += 1
print(num)
for i in range(5):
_thread.start_new_thread(add,())
while True:
pass
解决方案
第一种:join解决线程冲突
实验效果
实验代码中加上了join函数,join函数就是等待主程序执行完毕后才开始下一个线程的执行,因此可以有序的打印。while true是阻塞程序必备。
import threading
import time
num = 0
class Mythread(threading.Thread):
def run(self):
global num
for i in range(1000000):
num += 1
print(num)
for i in range(5):
t = Mythread()
t.start()
t.join()
while True:
pass
第二种:用锁解决
用锁的时候,一段线程访问时,另一个线程无法访问。因此这样也会成功的解决,效果图跟上面一样不用多赘述。需要强调的是,整个创建锁的流程需要大家记忆。
- 创建锁
- if判断锁,进行加锁
- 解锁
其中创建锁:mutex = threading.Lock()
判断锁:if mutex.acquire(1):
解锁:mutex.release()
import threading
import time
# 线程·冲突
# 线程·通信
num = 0
mutex = threading.Lock()
class Mythread(threading.Thread):
def run(self):
global num
if mutex.acquire(1):
for i in range(1000000):
num += 1
mutex.release()
print(num)
mythread = []
for i in range(5):
t = Mythread()
t.start()
mythread.append(t)
for thnum in mythread:
thnum.join()
print("over....")
以上就是python解决线程冲突问题,大家get了吗?