python编程-----利用线程锁解决线程并行问题

博客围绕Python中三个线程按顺序打印字符的问题展开。初始代码因sleep时间随机,线程执行顺序不确定。为控制顺序,引入线程锁,介绍了创建、锁定和释放锁的方法,并给出添加锁后的完整代码。还提及解决主线程提前退出问题的办法,以及考虑用队列解决该问题。

题目如下:

三个线程a,b,c,每个线程执行{for(int i=0;i!=10;i++) print(‘a’);sleep(random)},每个线程会分别打印出a,b,c这三个字符。3个线程并行执行,请让3个线程按顺序打印出字符

首先写出基础代码如下:

#打印函数
def print_abc( a ):
        time.sleep(random.random())
        print (a)
#定义线程
def A():
    for _ in range(10):
        print_abc("a")

def B():
    for _ in range(10):
        print_abc("b")
def C():
    for _ in range(10):
        print_abc("c")
#新建线程
try:
    _thread.start_new_thread(A,())
    _thread.start_new_thread(B,())
    _thread.start_new_thread(C,()) 
except:
    print("error")

如果这样写的话,由于sleep的时间是随机的,所以A,B,C的执行顺序也不确定。比如可能输出abbacbba…这种形式但是要求输出abcabcabc…这种形式。
为了控制它们的执行顺序,这里需要用到线程锁。

线程锁

当一个数据有多个线程都可以对其进行修改的时候,任何一个线程改变它都会对其他线程造成影响,如果我们某一个线程在使用完之前,其他线程不能对其修改,就需要对这个线程增加一个线程锁。
#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([timeout])
#释放
mutex.release()

将线程锁添加到我们的代码中,可得到完整代码如下:

import threading
import time
import random
import _thread
def print_abc( a ):
        time.sleep(random.random())
        print (a)
def A(lockCA,lockAB):
    for _ in range(10):
        lockCA.acquire()
        print_abc("a")
        lockAB.release()

def B(lockAB,lockBC):
    for _ in range(10):
        lockAB.acquire()
        print_abc("b")
        lockBC.release()
def C(lockBC,lockCA):
    for _ in range(10):
        lockBC.acquire()
        print_abc("c")
        lockCA.release()
    
try:
    lockAB = threading.Lock()
    lockBC = threading.Lock()
    lockCA = threading.Lock()
    lockAB.acquire()
    lockBC.acquire()
    _thread.start_new_thread(A,(lockCA,lockAB))
    _thread.start_new_thread(B,(lockAB,lockBC))
    _thread.start_new_thread(C,(lockBC,lockCA)) 
except:
    print("error")

利用锁的添加和释放,就能够很好地控制线程的执行顺序了。

注: 1.在打印的时候,我出现了可执行程序但无法打印的情况,此时可能是由于主线程提前退出。这种情况下,我在try的最后增加了input(),使得走完上面流程后等待键盘输入,最后结束程序。这样主线程就不会退出了,其他程序就可以执行完毕了。
2.该题目我觉得还可以用队列来做,利用先进先出的思想,有时间我会尝试补全。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值