How to call a async function contained in a class?

后端 未结 1 378
走了就别回头了
走了就别回头了 2020-12-04 10:55

Based on this answer I want to build an async websoket client in a class which would be imported from another file:

#!/usr/bin/env python3

import sys, json
         


        
相关标签:
1条回答
  • 2020-12-04 11:36

    Finally I could find the right way to do it (special thanks to @dirn)

    #!/usr/bin/env python3
    
    import sys, json
    import asyncio
    from websockets import connect
    
    class EchoWebsocket:
        async def __aenter__(self):
            self._conn = connect('wss://ws.binaryws.com/websockets/v3')
            self.websocket = await self._conn.__aenter__()        
            return self
    
        async def __aexit__(self, *args, **kwargs):
            await self._conn.__aexit__(*args, **kwargs)
    
        async def send(self, message):
            await self.websocket.send(message)
    
        async def receive(self):
            return await self.websocket.recv()
    
    class mtest:
        def __init__(self):
            self.wws = EchoWebsocket()
            self.loop = asyncio.get_event_loop()
    
        def get_ticks(self):
            return self.loop.run_until_complete(self.__async__get_ticks())
    
        async def __async__get_ticks(self):
            async with self.wws as echo:
                await echo.send(json.dumps({'ticks_history': 'R_50', 'end': 'latest', 'count': 1}))
                return await echo.receive()
    

    And this in main.py:

    from testws import *
    
    a = mtest()
    
    foo = a.get_ticks()
    print (foo)
    
    print ("async works like a charm!")
    
    foo = a.get_ticks()
    print (foo)
    

    This is the output:

    root@ubupc1:/home/dinocob# python3 test.py
    {"count": 1, "end": "latest", "ticks_history": "R_50"}
    async works like a charm!
    {"count": 1, "end": "latest", "ticks_history": "R_50"}
    

    Any tip to improve it is welcomed! ;)

    0 讨论(0)
提交回复
热议问题