【问题标题】:Consuming events from multiple Azure Event Hubs in one Python program在一个 Python 程序中使用来自多个 Azure 事件中心的事件
【发布时间】:2021-12-01 21:59:39
【问题描述】:

我有两个事件中心,每个都有自己的消费者组。我想同时接收来自他们每个人的事件,但我在GitHub samples 中看不到任何与此相关的内容。

更具体地说,我想利用asyncio 同时阅读这两个主题,但我是异步编程的新手,我想不通。我尝试过这样的事情,但它永远不会继续阅读client2

async with client1:
    async with client2:
        await client1.receive_batch(...)
        await client2.receive_batch(...)

我还尝试将async with 语句分开,甚至尝试在on_event_batch 函数中添加await asyncio.sleep(1),以确保将控制权交还给事件循环。

此时我不确定我想要做的事情是否无法通过asyncio 实现,或者我只是不知道如何使用它。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: python azure python-asyncio azure-eventhub


    【解决方案1】:

    receive_batch 被设计成一个阻塞调用,它不断地从事件中心抽取事件。

    为了方便asyncio并发执行协程任务,可以使用asyncio.create_task来执行receive_batch

    示例代码:

    async with client1, client2:
        future1 = asyncio.create_task(client1.receive_batch(...))
        future2 = asyncio.create_task(client2.receive_batch(...))
        results = await asyncio.gather(future1, future2)  # program will be blocking here waiting for two coroutines to finish
    

    有关 asyncio 模块的更高级用法,我建议您查看Coroutines and Tasks 的官方 Python 文档。

    如果还有什么我可以帮忙的,请告诉我。

    【讨论】:

    • 感谢亚当,这似乎是正确的方向,但不幸的是它仍然无法正常工作。对于这两个客户端中的每一个,我都成功地收到了一批,然后我收到了这个错误:An error occurred while receiving. The exception is TypeError("object NoneType can't be used in 'await' expression"). 然后整个事情重复了一遍:成功接收了另一批,又出现了另一个错误,依此类推。关于如何解决它的任何想法?
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2015-03-03
    • 1970-01-01
    • 2020-12-17
    • 2016-12-14
    • 2021-09-10
    相关资源
    最近更新 更多