码迷,mamicode.com
首页 > 编程语言 > 详细

python 多线程实现循环打印 abc

时间:2019-12-01 22:58:00      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:sleep   wait   __name__   cond   循环   join   pre   lob   targe   

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

标签:sleep   wait   __name__   cond   循环   join   pre   lob   targe   

原文地址:https://www.cnblogs.com/Draymonder/p/11967947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!