python 多线程实现循环打印 abc

Posted Draymonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 多线程实现循环打印 abc相关的知识,希望对你有一定的参考价值。

python 多线程实现循环打印 abc

好久没写过python了, 想自己实践一下把

非阻塞版

import threading
import time

def print_a():
    global value
    global lock
    global stop_flag
    while stop_flag:
        while True:
            if value == 0 or value == 3:
                break
        lock.acquire()
        value = 1
        time.sleep(1)
        print("aaa")
        lock.release()  

def print_b():
    global value
    global lock
    global stop_flag
    while stop_flag:
        while True:
            if value == 1:
                break
        lock.acquire()
        value = 2
        time.sleep(1)
        print("bbb")
        lock.release()

def print_c():
    global value
    global lock
    global stop_flag
    while stop_flag:
        while True:
            if value == 2:
                break
        lock.acquire()
        value = 3
        time.sleep(1)
        print("ccc")
        lock.release()

if __name__ == "__main__":
    stop_flag = True
    value = 0
    threads = []
    lock = threading.Lock()
    thread_a = threading.Thread(target=print_a)
    thread_b = threading.Thread(target=print_b)
    thread_c = threading.Thread(target=print_c)
    threads.append(thread_a)
    threads.append(thread_b)
    threads.append(thread_c)

    for thread in threads:
        thread.start()
    time.sleep(5)
    stop_flag = False

阻塞版

import threading
import time

def print_a():
    global value
    global stop_flag
    global lock
    global con
    while stop_flag:
        try:
            lock.acquire()
            while value != 0 and value != 3:
                con.wait()
            time.sleep(1)
            value = 1
            print("aaa")
            con.notify_all()
        finally:
            lock.release()


def print_b():
    global value
    global stop_flag
    global lock
    global con
    while stop_flag:
        try:
            lock.acquire()
            while value != 1:
                con.wait()
            time.sleep(1)
            value = 2
            print("bbb")
            con.notify_all()
        finally:
            lock.release()
    

def print_c():
    global value
    global stop_flag
    global lock
    global con
    while stop_flag:
        try:            
            lock.acquire()
            while value != 2:
                con.wait()
            time.sleep(1)
            value = 3
            print("ccc")
            con.notify_all()
        finally:
            lock.release()

if __name__ == "__main__":
    stop_flag = True
    value = 0
    threads = []
    # 注意这里使用的是条件变量
    lock = threading.Lock()
    con = threading.Condition(lock=lock)
    thread_a = threading.Thread(target=print_a)
    thread_b = threading.Thread(target=print_b)
    thread_c = threading.Thread(target=print_c)
    threads.append(thread_a)
    threads.append(thread_b)
    threads.append(thread_c)

    for thread in threads:
        thread.start()
    time.sleep(5)
    print("stop")
    stop_flag = False
    for thread in threads:
        thread.join()

以上是关于python 多线程实现循环打印 abc的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程循环打印ABC等问题(三种方式)

Java多线程循环打印ABC等问题(三种方式)

多线程 实现控制台打印“我爱你”10遍

多线程面试题之三线程按顺序交替打印ABC的方法

多线程交替打印ABC的多种实现方法

多线程交替打印ABC的多种实现方法