关于lock.acquire的Python3线程

时间:2018-01-05 04:48:28

标签: python multithreading python-3.x locking

当我测试时

import threading

def job1():
    global A
    a = lock.acquire()
    print(a)
    for i in range(10):
        A+=1
        print('job1',A)
    lock.release()

def job2():
    global A
    for i in range(10):
        A+=10
        print('job2',A)

if __name__== '__main__':
    lock=threading.Lock()
    A=0
    t1=threading.Thread(target=job1)
    t2=threading.Thread(target=job2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

大部分时间,结果是(条件1):

True
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110

但其中一个结果是(条件2)

True
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job2 17
job2 27
job2 37
job2 47
job2 57
job2 67
job2 77
job2 87
job2 97
job2 107
job1 108
job1 109
job1 110

我应该将帖子锁定在job1中,为什么结果2会出来?

如果我在lock.acquire中添加了另一个lock.releasejob2语句,我发现结果将始终为条件1,但为什么?

1 个答案:

答案 0 :(得分:0)

Lock实例中有一个线程安全的计数器,lock.acquire表示如果计数器大于0,则传递,否则阻塞。 lock.release表示counter = counter + 1

因此要同步两个线程,您需要在两个线程中使用锁定。如果job1没有lock.release,则计数器为0,lock.acquire内的job2将阻止,直到job1调用lock.release

这就是锁定的基本工作方式。

更新

除{strong>确实在其中使用锁之外,job2内没有任何锁定。我知道你想要什么,你想要阻止job2,直到job1致电lock.release。但是您需要通过调用job2明确告诉lock.acquire阻止。或者job2如何知道自己应该被阻止?

更进一步,假设您有两个不同的锁实例a, b和两对线程jobA1, jobA2, jobB1, jobB2。您可以使用a同步jobA1jobA2,并使用b同步jobB1jobB2。但是你需要明确告诉每个线程他们应该使用哪个锁。