【问题标题】:Two threads print even and odd numbers between 0 to 5 alternatively in Python两个线程在 Python 中交替打印 0 到 5 之间的偶数和奇数
【发布时间】:2022-11-26 23:11:01
【问题描述】:

我试图获得以下交替运行 2 个线程的结果。 *在 0 到 5 之间,线程 A 打印偶数,线程 B 打印奇数:

A:0
B:1
A:2
B:3
A:4
B:5

因此,使用全局变量、锁和 while 语句,我创建了下面的代码来尝试获得上面的结果:

import threading
lock = threading.Lock()
owner = "A"
i = 0

def test1():
    global owner, i
    while i <= 5:
        lock.acquire()
        if owner == "A":
            print(owner + ":" + str(i))
            owner = "B"
            i += 1
        lock.release()

def test2():
    global owner, i
    while i <= 5:
        lock.acquire()
        if owner == "B":
            print(owner + ":" + str(i))
            owner = "A"
            i += 1
        lock.release()

A = threading.Thread(target=test1)
B = threading.Thread(target=test2)

A.start()
B.start()

A.join()
B.join()

但是,上面的代码使用 A:6 得到了下面的结果。 *线程A 打印偶数6

A:0
B:1
A:2
B:3
A:4
B:5
A:6 # Here

我找不到任何错误,所以如果没有A:6,我怎么能得到正确的结果呢?为什么我用A:6得到了结果?

【问题讨论】:

    标签: python python-3.x multithreading python-multithreading alternate


    【解决方案1】:

    您看到此问题的原因是当i5 移动到6 时线程仍在 while 循环内。因此,您唯一的检查是所有者是否等于AB。所以你必须再次进行检查以测试i&lt;=5

    import threading
    lock = threading.Lock()
    owner = "A"
    i = 0
    
    def test1():
        global owner, i
        while i <= 5:
            lock.acquire()  # Here
            if owner == "A" and i<=5:
                print(owner + ":" + str(i))
                owner = "B"
                i += 1
            lock.release()
    
    def test2():
        global owner, i
        while i <= 5:
            lock.acquire()  # Here
            if owner == "B" and i<=5:
                print(owner + ":" + str(i))
                owner = "A"
                i += 1
            lock.release()
    
    A = threading.Thread(target=test1)
    B = threading.Thread(target=test2)
    
    A.start()
    B.start()
    
    A.join()
    B.join()
    

    输出:

    A:0
    B:1
    A:2
    B:3
    A:4
    B:5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多