基于此答案,我想在一个将从另一个文件导入的类中构建一个异步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开头是async
单词,为什么我不能访问它def
?
最后,我可以找到正确的方法(特别感谢 @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()
这在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)
这是输出:
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"}
任何改进的技巧都值得欢迎!;)
我想知道哪种方法是测试不返回任何函数(只更改一个字段值)并包含异步调用的最佳方法。 这是我要测试的AngularJS控制器,我调用的服务返回一个promise(总是返回{name:"John"}): 如果sayHello函数不包含异步调用,这将是规范,但它总是失败,因为scope.greeting总是空的。 我将如何使用此规范来处理异步调用?我真的不明白如何以及在哪里使用Jasmine 2.0的“
问题内容: 假设您维护一个公开一个函数的库。您的用户调用它来获取实际数据: 数据被保存在文件中,因此您可以使用内置的Node.js来实现。很明显这两个和是同步的功能。有一天,您被告知将基础数据源切换到只能异步访问的仓库(例如MongoDB)。还被告知要避免惹恼您的用户,API不能更改为仅返回promise或要求回调参数。您如何满足这两个要求? 使用回调/承诺的异步功能是JavasSript和Nod
我有以下问题:我试图从函数调用闭包,但是以后必须调用另一个函数。 我无法创建异步闭包,因为它们目前不稳定: 所以我得以某种方式这样做。 我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误: 这里是游乐场链接,希望能显示我有什么问题。 我正在使用标题中所述的tokio。
我有一个异步函数getIdentByInfo,在控制台中,如果我将它记录在这个函数中,就会得到正确的输出。当我在另一个组件中调用它时,它就不工作了,我只得到“未定义”。我知道这与蜂群同步和承诺有关,但我不知道如何解决我的问题。我需要在另一个组件中填充来自http请求的属性的模型类,以便将它们发送到另一个服务
问题内容: 我目前正在编写JavaScript,并对 callback 感到困惑。我发现它不是内置函数…… 我现在正在阅读O’Relly JavaScript 5th Edition,它显示了示例代码,如下所示: 基本上,我想我不了解…… 的总体思路。有人可以编写示例代码来利用上面的优势吗? 问题答案: 回调非常简单又漂亮!由于AJAX调用的性质,您 不会 阻塞脚本的执行,直到您的请求结束(然后它
我的JavaScript代码如下所示: 完成所有这些异步调用后,我想计算所有数组的最小值。 我怎么能等到他们所有人呢? 我现在唯一的想法是有一个布尔数组叫做done,并在第i个回调函数中将done[i]设置为true,然后说while(not all are done){} edit:我想一个可能的,但很难看的解决方案是在每个回调中编辑done数组,然后在每个回调中设置了所有其他done的情况下调