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

Posted benlam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列 + 线程实现简单异步相关的知识,希望对你有一定的参考价值。

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

#!/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
			输入队列消息:
			[因为消息队列阻塞原因,可以无限收发队列消息,但不要超过最大值]
"""

以上是关于消息队列 + 线程实现简单异步的主要内容,如果未能解决你的问题,请参考以下文章

系统学习消息队列分享(十) 如何实现高性能的异步网络传输?

生产者消费者模型实现多线程异步交互

同步异步和Event loop事件循环

js异步——事件循环和消息队列

Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)

02-伪异步I/O通讯模型