代码之家  ›  专栏  ›  技术社区  ›  turtle_in_mind

构建异步websocket迭代器

  •  0
  • turtle_in_mind  · 技术社区  · 4 年前

    我创建了一个类,它是一个websocket,可以毫无问题地连接到我的数据端点。然而,我希望我的套接字永远运行。我正在使用websockets python库。以下是一个样本:

    from websockets import connect
    
    
    class Socket(metaclass=ABCMeta):
    def __init__(self, url: str):
        self.url = url
    
    async def __aenter__(self):
        self._conn = connect(self.url, ping_interval=None)
        self.websocket = await self._conn.__aenter__()
        return self
    
    async def __aexit__(self, *args, **kwargs):
        await self._conn.__aexit__(*args, **kwargs)
    

    现在,我可以毫无问题地编写async with语句了。当我希望我的插座保持连接时,我的问题就出现了。

    在图书馆阅读,一个建议的方法似乎是做以下事情:

    async for socket in websockets.connect(", ping_interval=None):
        try:
             your logic
        except websockets.closedConnection as e:
            continue
    

    这让我可以在出现问题时继续尝试连接。如何将其作为迭代器合并到我的类中?我尝试了以下操作,但出现了错误:

     TypeError: 'async for' received an object from __aiter__ that does not implement __anext__: coroutine
    

    在我在上面的类中添加了以下代码之后:

    async def __aiter__(self):
        return self
    
    async def __anext__(self):
        async for websocket in connect(self.url, ping_interval=None):
            try:
                self.websocket = await websocket
            except StopIteration:
                raise StopAsyncIteration
    

    我不是在这里发布我的全部代码,因为我的目标是围绕我创建的这个套接字类封装一个类,目标是

    async for object in MyCustomClassSocketIterator(url):
        try:
         await object.send()
         await object.receive()
        except websockets.closedConnection as e:
    etc....
    

    其中封装的类实现了receive()和send()函数。所以每次程序启动时,对象都会异步实例化。如果有什么东西坏了。。。然后,如果有插座,它会尝试再次连接。闭合连接。谢谢

    0 回复  |  直到 4 年前