在 Python 中并行打开多个 Websocket

Opening multiple Websockets in parallel in Python

我正在使用 Python 中的 websocket 库,我是新手。

我想创建多个不同的 websockets 连接。这是通过我的自定义 WebsocketProcess class 发生的,它打开连接、接收事件、保留记录 ID,然后调用 API 来获取该特定记录的信息。

我在运行并行处理它们时遇到了问题。

请看下面(忽略大量导入)

主要:

#if __name__ == "__main__":
async def main():

    #The length AccessTokens, ClientDescriptions and SQLTablesFix determines how many websockets we need to open
    L = await asyncio.gather(
        properties[0].websocket_starting(AccessTokens[0], ClientDescriptions[0], SQLTablesFix[0]),  
        properties[1].websocket_starting(AccessTokens[1], ClientDescriptions[1], SQLTablesFix[1]),
        ...
        ...
       )
    
asyncio.run(main())

WebsocketProcessclass如下:

class WebsocketProcess:
    """description of class"""

    def on_error(self, ws, error):
        #{Relevant Code Here}


    def on_open(self, ws):
        print("\nOn Open\n")
        def run(*args):
            while True:
                try:
                    time.sleep(1)
                except TimeoutError:
                    pass
            ws.close()

    def on_close(self):
        #{Relevant Code Here}


    def on_message(self, ws, message):
        #{Relevant Code Here}
        ws.close()


    def connect_websocket(self, AccessToken, ClientDescription, SQLTablesFix):
        ws = websocket.WebSocketApp("_______url_here_____",        
                                   on_open = self.on_open,
                                   on_message = self.on_message,
                                   on_error = self.on_error,
                                   on_close = self.on_close,
                                   cookie = "ClientToken=_______; AccessToken=%s" % AccessToken)
        ws.run_forever()



    async def websocket_starting(self, AccessToken, ClientDescription, SQLTablesFix):
        print("\nwebsocket_starting")
        self.AccessToken = AccessToken
        self.ClientDescription = ClientDescription
        self.SQLTablesFix = SQLTablesFix

        self.connect_websocket(self.AccessToken, self.ClientDescription, self.SQLTablesFix)

正如您从上面看到的,我已经将 main 更改为异步 运行 并行 websocket_process class 的多个实例。它打开与第一个 websocket 的连接,然后停止在那里等待事件,而不继续打开第二个 websocket。

我尝试使 WebsocketProcess class 完全异步,但我收到的错误指出从未等待协程 'run'(在 connect_websocket 方法中)。

你们对如何 运行 websocket_process class 的多个实例并行有什么建议吗?

谢谢!

您的 websocket 操作是阻塞操作,要在 asyncio 中使用 websocket,请使用其他异步库,例如 websockets, Tornado