Python Rlock执行顺序

一个类的run()方法有两个方法定义,当使用多线程时,该run()方法中的两个方法执行顺序如何?

为什么每次打印顺序都不一样,actionA和actionB在这种线程中执行顺序是怎么样的?

import threading
import time


class MyThread(threading.Thread):

    def actionA(self):
        lock.acquire()
        print(self.name, 'getA-', time.strftime('%X'))
        time.sleep(2)

        lock.acquire()
        print(self.name, 'getB-', time.strftime('%X'))
        time.sleep(1)
        lock.release()

        lock.release()


    def actionB(self):
        lock.acquire()
        print(self.name, 'getA*', time.strftime('%X'))
        time.sleep(2)

        lock.acquire()
        print(self.name, 'getB*', time.strftime('%X'))
        time.sleep(1)
        lock.release()

        lock.release()

    def run(self):
        self.actionA()
        self.actionB()

if __name__ == '__main__':
    lock = threading.RLock()

    l = []

    for i in range(5):
        t = MyThread()
        t.start()
        l.append(t)

    for s in l:
        s.join()

    print('ending---')

 

如果你希望在多线程情况下控制线程的执行顺序,你可以使用锁机制,例如 Python 中的 Rlock,来控制线程的执行。

具体实现方式如下:

在线程执行前调用 Rlock 的 acquire 方法,获取锁。

在线程执行完毕后调用 Rlock 的 release 方法,释放锁。

这样就可以保证在多线程情况下,线程的执行顺序按照代码中的顺序进行。

import threading

rlock = threading.RLock()

def actionA():
    rlock.acquire()
    print("actionA")
    rlock.release()

def actionB():
    rlock.acquire()
    print("actionB")
    rlock.release()

# 创建线程
thread1 = threading.Thread(target=actionA)
thread2 = threading.Thread(target=actionB)

# 启动线程
thread1.start()
thread2.start()

这样就可以保证在多线程情况下, actionA 和 actionB 的执行顺序按照代码中的顺序进行。