0

我在 Python 中使用 websocket 库,我对此并不陌生。

我想为 websockets 创建多个不同的连接。这通过我的自定义 WebsocketProcess 类发生,该类打开连接、接收事件、保留记录 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())

WebsocketProcess 类如下:

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 类的多个实例。它打开到第一个 websocket 的连接,并在那里停止等待事件,而不继续打开第二个 websocket。

我尝试使 WebsocketProcess 类完全异步,但我收到一个错误,指出从未等待协程“运行”(在 connect_websocket 方法中)。

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

谢谢!

4

1 回答 1

0

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

于 2021-07-23T16:28:38.000 回答