时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路

nameko 和 eventlet 已经凉了

nameko 已经凉了, 最后一次 commit 停留在了 2023.11.3 。如何将您的 Eventlet 项目迁移到 Asyncio

eventlet 也是几乎停止了维护,已经无法支持 cpython3.13+ 的版本了。nameko 无法适配新版的python3.14,eventlet 停止维护导致的失效

github.com/eventlet/ev...


nameko 的现代化替代品:faststream

我觉得最合理的处理方案,是用 faststream 替代 nameko:github.com/ag2ai/fasts...


代码实现,使用 faststream 等价实现 nameko 的功能

回答两个关键字的问题:

from nameko.events import event_handler 的替代品是什么?

from nameko.standalone.events import event_dispatcher 的替代品是什么?

event_dispatcher 的替代品,用 broker.publish

nameko 的生产者投递数据给 rabbitmq 的用法

python 复制代码
from nameko.standalone.events import event_dispatcher

# 1. 配置 RabbitMQ 连接信息
config = {
    'AMQP_URI': 'pyamqp://ponponon:ponponon@192.168.38.223:5672/'
}

# 2. 创建事件分发器 (Dispatcher)
dispatch = event_dispatcher(config)

# 3. 发布事件 (同步操作)
# service_name 对应 exchange_name (source_service)
# event_type 对应 routing_key (event_type)
dispatch(
    "source_service", 
    "event_type", 
    {"data": "hello"}
)

print("事件已发布 (Nameko)")

faststream 的生产者投递数据给 rabbitmq 的用法

python 复制代码
import asyncio
from faststream.rabbit import RabbitBroker

async def main():
    broker = RabbitBroker("amqp://ponponon:ponponon@192.168.38.223:5672/")
    
    async with broker:
        # 替代 event_dispatcher
        # exchange 对应服务名,routing_key 对应事件名
        await broker.publish(
            {"data": "hello"}, 
            exchange="source_service", 
            routing_key="event_type"
        )
        print("事件已发布")

asyncio.run(main())

event_handler 的替代品,使用 @broker.subscriber

nameko 作为消费者消费 rabbitmq 消息的用法示例

python 复制代码
from nameko.events import event_handler

class ReceiverService:
    # 1. 服务名称 (对应 FastStream 的 RabbitExchange 名称)
    name = "receiver_service"

    # 2. 替代 FastStream 的 @broker.subscriber
    # source_service 对应 exchange="source_service"
    # event_type 对应 routing_key="event_type"
    @event_handler("source_service", "event_type")
    def handle_event(self, payload):
        # Nameko 默认在内部自动创建队列并处理消息
        print(f"收到事件消息 (Nameko): {payload}")

# 启动方式: nameko run nameko_consumer

faststream 作为消费者消费 rabbitmq 消息的用法示例

python 复制代码
from faststream import FastStream
from faststream.rabbit import RabbitBroker, RabbitExchange, ExchangeType

broker = RabbitBroker("amqp://ponponon:ponponon@192.168.38.223:5672/")
app = FastStream(broker)

# 定义 Exchange (对应 nameko 的 source_service)
event_exchange = RabbitExchange("source_service", type=ExchangeType.TOPIC)

# 替代 event_handler
# routing_key 对应 nameko 的 event_type
@broker.subscriber(queue="my_handler_queue", exchange=event_exchange, routing_key="event_type")
async def handle_event(msg: dict):
    print(f"收到事件消息: {msg}")

启动方式: faststream run xx:app xx 是你的 py 文件的名称

注意事项

nameko 升级到 faststream 绝对不是容易的事情,因为他们的并发模型是完全不一样的

nameko 是基于 eventlet 实现的同步协程,而 faststream 是基于 python 官方提供的 asyncio 做的异步协程,最大的区别就是调用的各种第三库也要从同步库改成异步库,这个工作量是很大的,比如把 pymysql 改成 aiomysql;requests 需要改成 httpx 等等

如果你不想改库的话,那就得用 asyncio.to_thread。但这样就麻烦了,你的项目里面又有同步库又有异步库,维护起来就很费神

各种利弊,自行权衡吧

相关推荐
2601_962293244 小时前
Python自动化统计团队工作量并生成可视化仪表盘的脚本方案【指导】
python·数据分析·自动化·可视化·仪表盘
2601_962293795 小时前
OCRmyPDF批处理脚本:使用Python自动化复杂OCR任务
python·自动化·批处理脚本·ocrmypdf·ocr任务
Java后端的Ai之路6 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
2601_962077717 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert7 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
郝学胜-神的一滴8 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
m0_380743878 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297489 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”9 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习9 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机