如何解决具有异步功能的装饰器
我正在尝试在python中实现实时网络摄像头服务,因此我希望使用aiortc。通过查看GitHub page上的示例,我发现了一个陌生的东西,我不明白它是如何工作的。
examples文件夹上的server/server.py
上有一个带有装饰器的async
函数。该函数从未调用过,所以我不明白装饰器的工作方式。
pc = RTCPeerConnection()
.......
@pc.on("iceconnectionstatechange")
async def on_iceconnectionstatechange():
log_info("ICE connection state is %s",pc.iceConnectionState)
if pc.iceConnectionState == "Failed":
await pc.close()
pcs.discard(pc)
在这种情况下,永远不会调用函数on_iceconnectionstatechange
。以哪种方式调用@pc.on
装饰器?
解决方法
RTCPeerConnection
继承自link的AsyncIOEventEmitter
(pyee
module)。 pyee
是事件系统模块。 AsyncIOEventEmitter
装饰器方法来自此on
类。
on_iceconnectionstatechange
函数从不直接调用,但是装饰器将其注册为事件侦听器,因此只要发生该事件,就会调用它,例如here。
由于装饰器的工作方式,问题中的代码片段大致等同于:
decorator = pc.on("iceconnectionstatechange")
async def on_iceconnectionstatechange():
log_info("ICE connection state is %s",pc.iceConnectionState)
if pc.iceConnectionState == "failed":
await pc.close()
pcs.discard(pc)
on_iceconnectionstatechange = decorator(on_iceconnectionstatechange)
以下是decorator
(来自here)的“定义”摘录:
def _on(f):
self._add_event_handler(event,f,f)
return f
此处,event
的值为"iceconnectionstatechange"
,因此代码等效于:
async def on_iceconnectionstatechange():
log_info("ICE connection state is %s",pc.iceConnectionState)
if pc.iceConnectionState == "failed":
await pc.close()
pcs.discard(pc)
pc._add_event_handler("iceconnectionstatechange",on_iceconnectionstatechange,on_iceconnectionstatechange)
由于调用了decorator
函数,因此可以在某个内部词典中注册on_iceconnectionstatechange
,以便在发出相关事件时调用它。装饰器在没有直接调用on_iceconnectionstatechange
的情况下注册了事件侦听器,因为它在创建它时就注册了它,而不是等待它被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。