zoukankan      html  css  js  c++  java
  • 消息队列 + 线程实现简单异步

    通过消息队列 + 线程实现简单异步

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2020/4/22 9:54
    # @File    : thread_test.py
    # @Author  : BenLam
    # @Link    : https://www.cnblogs.com/BenLam/
    # @Version : PyCharm
    
    import random
    import queue
    import threading
    
    text = queue.Queue()
    def msg():
        '''
        # 生成消息队列假数据
        '''
        li = random.sample(range(100), 18)
        li.append("kill")
        random.shuffle(li)
        print(f"生成消息队列 <- {li} ->")
        for message in li:
            send("->> " + str(message) )
            if message == "kill": break
    
    def send( msg ):
        text.put( msg )
    
    def recv_a():
        '''
        # 判断消息队列是否为空
        '''
        while text.empty() == False:
            msg = text.get()
            print( "recv_a: ", msg )
    
    def recv_b():
        '''
        # 消息队列获取为空抛出异常
        '''
        while True:
            try:
                msg = text.get(False)
                print( "recv_b: ", msg )
            except queue.Empty:
                print("recv_b 消息队列为空")
                break
    
    def recv_c():
        '''
        # 简单的异步
        '''
        while True:
            msg = text.get()
            print( "recv_c: ", msg )
    
    if __name__ == "__main__":
        print("--- 开始 ---")
        msg()
        a = threading.Thread( target=recv_a )
        a.start()
        a.join()
    
        msg()
        b = threading.Thread( target=recv_b )
        b.start()
        b.join()
    
        c = threading.Thread( target=recv_c )
        c.start()
    
        while True:
            message = input("输入队列消息: ")
            send( "打印输出消息 -> " + message )
        c.join()
    
    """
    打印:
    	--- 开始 ---
    		生成消息队列 <- [27, 42, 46, 67, 30, 53, 22, 11, 73, 72, 20, 82, 62, 31, 76, 61, 47, 60, 'kill'] ->
    			recv_a:  ->> 27
    			recv_a:  ->> 42
    			recv_a:  ->> 46
    			recv_a:  ->> 67
    			recv_a:  ->> 30
    			recv_a:  ->> 53
    			recv_a:  ->> 22
    			recv_a:  ->> 11
    			recv_a:  ->> 73
    			recv_a:  ->> 72
    			recv_a:  ->> 20
    			recv_a:  ->> 82
    			recv_a:  ->> 62
    			recv_a:  ->> 31
    			recv_a:  ->> 76
    			recv_a:  ->> 61
    			recv_a:  ->> 47
    			recv_a:  ->> 60
    			recv_a:  ->> kill
    		生成消息队列 <- [23, 5, 31, 'kill', 92, 87, 47, 55, 46, 2, 34, 32, 4, 88, 6, 19, 84, 30, 80] ->
    			recv_b:  ->> 23
    			recv_b:  ->> 5
    			recv_b:  ->> 31
    			recv_b:  ->> kill
    			recv_b 消息队列为空
    			输入队列消息: A
    			recv_c:  打印输出消息 -> A
    			输入队列消息: B
    			recv_c:  打印输出消息 -> B
    			输入队列消息: C
    			recv_c:  打印输出消息 -> C
    			输入队列消息: D
    			recv_c:  打印输出消息 -> D
    			输入队列消息:
    			[因为消息队列阻塞原因,可以无限收发队列消息,但不要超过最大值]
    """
    
  • 相关阅读:
    使用脚本改变树控件的行为 (转)点文本 收..
    (面包屑)SiteMapPath控件简化Web网站导航 (转)
    Web.config详解(转)
    SiteMap(站点地图)示例(转)
    url传递中文的解决方案总结(转)
    INI文件编程,WINAPI函数WritePrivateProfileString,GetPrivateProfileString(转帖)
    hdu 2708
    hdu 1709
    hdu 1045
    hdu 2714
  • 原文地址:https://www.cnblogs.com/BenLam/p/12750794.html
Copyright © 2011-2022 走看看