时代的眼泪,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。但这样就麻烦了,你的项目里面又有同步库又有异步库,维护起来就很费神

各种利弊,自行权衡吧

相关推荐
Flittly2 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
python·agent
敏编程2 小时前
一天一个Python库:pyarrow - 大规模数据处理的利器
python
Flittly4 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(4)Subagents (子智能体)
python·agent
明月_清风11 小时前
Python 装饰器前传:如果不懂“闭包”,你只是在复刻代码
后端·python
明月_清风11 小时前
打破“死亡环联”:深挖 Python 分代回收与垃圾回收(GC)机制
后端·python
ZhengEnCi1 天前
08c. 检索算法与策略-混合检索
后端·python·算法
明月_清风1 天前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python
明月_清风1 天前
Python 消失的内存:为什么 list=[] 是新手最容易踩的“毒苹果”?
后端·python
Flittly2 天前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent