天天看点

python两种方法解决线程冲突问题线程冲突起因解决方案

本博文源于python基础炫酷技能,主要讲述python的线程的问题。大家学到多线程的时候只要搞明白两种东西即可,第一线程通信,另一个叫做线程冲突。本博文就以一种打印数字的方法浅析线程冲突的解决方案!

线程冲突起因

例子:多线程累加数据到5百万

没使用多线程之前

实验效果

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):
    add()
           

这里的代码非常直观和浅显,大家应该都能理解

使用多线程出现的冲突

实验效果

python两种方法解决线程冲突问题线程冲突起因解决方案

实验代码

这里就调用了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解决线程冲突

实验效果

python两种方法解决线程冲突问题线程冲突起因解决方案

实验代码中加上了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了吗?