当前位置: 首页 > 面试题库 >

如何调用一个类中包含的异步函数?

符棋
2023-03-14
问题内容

基于此答案,我想在一个将从另一个文件导入的类中构建一个异步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的情况下调