【发布时间】:2017-02-02 17:59:14
【问题描述】:
基于this answer,我想在一个类中构建一个异步 websoket 客户端,该类将从另一个文件导入:
#!/usr/bin/env python3
import sys, json
import asyncio
from websockets import connect
class EchoWebsocket:
def __await__(self):
# see: https://stackoverflow.com/a/33420721/1113207
return self._async_init().__await__()
async def _async_init(self):
self._conn = connect('wss://ws.binaryws.com/websockets/v3')
self.websocket = await self._conn.__aenter__()
return self
async def close(self):
await self._conn.__aexit__(*sys.exc_info())
async def send(self, message):
await self.websocket.send(message)
async def receive(self):
return await self.websocket.recv()
class mtest:
async def start(self):
try:
self.wws = await EchoWebsocket()
finally:
await self.wws.close()
async def get_ticks(self):
await self.wws.send(json.dumps({'ticks_history': 'R_50', 'end': 'latest', 'count': 1}))
return await self.wws.receive()
if __name__ == '__main__':
a = mtest()
loop = asyncio.get_event_loop()
loop.run_until_complete(a.start())
我将它导入main.py,其中有以下内容:
from testws import *
a = mtest()
print (a.get_ticks())
print ("this will be printed after the ticks")
但它检索到以下错误:
root@ubupc1:/home/dinocob# python3 test.py
<coroutine object hello.get_ticks at 0x7f13190a9200>
test.py:42: RuntimeWarning: coroutine 'mtest.get_ticks' was never awaited
print (a.get_ticks())
this will be printed after the ticks
这里发生了什么?如果 mtest.get_ticks 在 def 的开头有 async 字样,为什么我无法访问它?
【问题讨论】:
-
调用时需要使用
await。 -
通过这种方式调用函数时出现语法错误:
foo = await a.get_ticks()... -
你不能在协程之外使用
await。如果您尝试在另一个协程之外执行协程,则需要使用事件循环来安排它(例如,loop.run_until_complete(a.get_ticks()))。 -
好的,但是我如何将 get_ticks 的返回值设置为变量?请你给我一个你在说什么的工作例子,好吗? :)
-
foo = loop.run_until_complete(a.get_ticks())
标签: python websocket python-asyncio