如何在Python中锁定部分方法

tul*_*84z -3 python multithreading python-multithreading python-2.7

我想锁定该方法的一部分(“等待获取锁定”之后的那部分应该仅在第一个线程释放锁定之后才能运行)。发生的情况是两个线程都独立运行,而与lock.acquire()无关。

我不知道为什么这不起作用。stackoverflow中的示例与此类似,但并不完全相同。请看一下我为什么需要这样做:我没有显式的共享资源,我只想防止2个python线程运行相同的代码,因为在我正在开发的系统中,它们可能会将系统置于不稳定的状态。

import threading, time

def test(name):
    lock = threading.Lock()

    print(name + " - Starting thread")
    print(name + " - Waiting to acquire lock")
    lock.acquire(True)
    try:
        print(name + " - Lock acquired!")
        for i in range(10):

            print(name + " - " + str(i))
            print("")
            time.sleep(1)
    finally:
        lock.release()
        print(name + " - Lock released")

def main():

    t1 = threading.Thread(target=test, args=["#1_Thread"])
    t2 = threading.Thread(target=test, args=["#2_Thread"])

    t1.start()
    time.sleep(3)
    t2.start()

main()
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

每个线程都创建并锁定自己的独立锁:

def test(name):
    lock = threading.Lock()
    ...
Run Code Online (Sandbox Code Playgroud)

那不会提供相互排斥。两个线程可以同时锁定不同的锁而不会发生冲突。锁仅在两个线程试图锁定同一锁时才执行任何操作。

创建一个锁并将其提供给两个线程。当您使用它时,with声明通常是确保清除的最佳方法,而不是finally块。当执行进入时将锁定该锁,with而在执行离开时将其解锁

import threading, time

def test(name, lock):
    print(name + " - Starting thread")
    print(name + " - Waiting to acquire lock")
    with lock:
        print(name + " - Lock acquired!")
        for i in range(10):

            print(name + " - " + str(i))
            print("")
            time.sleep(1)
    print(name + " - Lock released")

def main():
    lock = threading.Lock()

    t1 = threading.Thread(target=test, args=["#1_Thread", lock])
    t2 = threading.Thread(target=test, args=["#2_Thread", lock])

    t1.start()
    time.sleep(3)
    t2.start()

main()
Run Code Online (Sandbox Code Playgroud)