我创建了一个类,它是一个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()函数。所以每次程序启动时,对象都会异步实例化。如果有什么东西坏了。。。然后,如果有插座,它会尝试再次连接。闭合连接。谢谢