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()
posted @ 2019-12-01 21:56  Draymonder  阅读(...)  评论(... 编辑 收藏