首页 > 解决方案 > threading.lock 强制线程顺序运行?

问题描述

我的虚拟脚本使用了两个函数,一个加 1,一个减 1。我试图用线程异步运行每个函数 1000000 次,并使用锁来防止竞争条件。

但是,我注意到当我的锁在for loop自身内部使用时,同一个线程将运行直到循环完成,这让我相信线程是同步运行的。

这是我的脚本的外观:

master_count = 0
trials = 1000
import threading

def add_count():
    global master_count
    for i in range(trials):
        with lock:
            print(threading.current_thread().getName())
            master_count += 1



def subtract_count():
    global master_count
    for i in range(trials):
        with lock:
            print(threading.current_thread().getName())

            master_count -= 1



lock = threading.Lock()

t1 = threading.Thread(target = add_count, name = 'add1' )
t2 = threading.Thread(target = add_count, name = 'add2' )
t3 = threading.Thread(target = subtract_count, name = 'subtract1' )
t4 = threading.Thread(target = subtract_count, name = 'subtract2' )

t1.start()
t2.start()
t3.start()
t4.start()


t4.join()
t2.join()
t3.join()
t1.join()

print(master_count)

我看到这个输出到 python shell(10 次试验):

add1
add1
add1
add1
add1
add1
add1
add1
add1
add1
add2
add2
add2
add2
add2
add2
add2
add2
add2
add2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1

我想如果脚本正在异步运行,我会看到混合的线程名称,而不是这个有序的输出。

我也在一个While循环中尝试过这个,但我遇到了同样的问题。

那么它实际上是同步运行的吗?如果是这样,我怎样才能让它与锁异步运行。

谢谢你。

标签: python-3.xmultithreadingrace-conditionlocks

解决方案


推荐阅读