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

异步函数阻塞主线程

  •  0
  • noobyy  · 技术社区  · 2 年前

    您好,我想通过python创建一个客户端套接字,我发现了这个例子( https://stackoverflow.com/a/49918082/12354066 ).我唯一想知道的问题是,我有一个完整的其他程序,我想用它来实现这一点,而且 loop.run_until_complete(asyncio.wait(tasks)) 阻塞了整个线程,不允许我在 环运行_直到_完成(异步。等待(任务)) .我想能够倾听&发送消息,但我也希望在开始监听后能够执行其他消息,也许这更适合线程,而不是异步(我不太懂异步….)

    import websockets
    import asyncio
    
    class WebSocketClient():
    
        def __init__(self):
            pass
    
        async def connect(self):
            '''
                Connecting to webSocket server
    
                websockets.client.connect returns a WebSocketClientProtocol, which is used to send and receive messages
            '''
            self.connection = await websockets.client.connect('ws://127.0.0.1:8765')
            if self.connection.open:
                print('Connection stablished. Client correcly connected')
                # Send greeting
                await self.sendMessage('Hey server, this is webSocket client')
                return self.connection
    
    
        async def sendMessage(self, message):
            '''
                Sending message to webSocket server
            '''
            await self.connection.send(message)
    
        async def receiveMessage(self, connection):
            '''
                Receiving all server messages and handling them
            '''
            while True:
                try:
                    message = await connection.recv()
                    print('Received message from server: ' + str(message))
                except websockets.exceptions.ConnectionClosed:
                    print('Connection with server closed')
                    break
    
        async def heartbeat(self, connection):
            '''
            Sending heartbeat to server every 5 seconds
            Ping - pong messages to verify connection is alive
            '''
            while True:
                try:
                    await connection.send('ping')
                    await asyncio.sleep(5)
                except websockets.exceptions.ConnectionClosed:
                    print('Connection with server closed')
                    break
    

    主要内容:

    import asyncio
    from webSocketClient import WebSocketClient
    
    if __name__ == '__main__':
        # Creating client object
        client = WebSocketClient()
        loop = asyncio.get_event_loop()
        # Start connection and get client connection protocol
        connection = loop.run_until_complete(client.connect())
        # Start listener and heartbeat 
        tasks = [
            asyncio.ensure_future(client.heartbeat(connection)),
            asyncio.ensure_future(client.receiveMessage(connection)),
        ]
    
        loop.run_until_complete(asyncio.wait(tasks))
        print(1) # never gets executed
    
    0 回复  |  直到 2 年前