我正在尝试使用asyncio调用REST API异步,但是我一直收到我理解的错误“ coroutine was never awaited
”。但是我想要这种行为,我希望我的函数仅通过发布而不是等待结果来结束。这是我的代码
async def callCoroutine:
#call a REST API
def lambda_handler(event, context):
loop = asyncio.get_event_loop()
task = loop.create_task(callCoroutine(data))
return
有人可以帮忙吗?
答案 0 :(得分:1)
如果只需要调用API,而不必考虑结果,则可以在另一个线程中使用执行程序,这不会阻塞主线程。
要在执行程序中运行,请将AbstractEventLoop.run_in_executor()与concurrent.futures中的执行程序一起使用。
答案 1 :(得分:1)
对于当前示例,您需要在某个地方运行循环(例如,如果您有一些Web服务器或辅助服务器-http://localhost:1234/laravel/myoctober/
)
loop.run_forever()
import asyncio
async def callCoroutine(data):
print('This is data: %s' % data)
def lambda_handler(event, context):
loop = asyncio.get_event_loop()
task = loop.create_task(callCoroutine(context))
return
lambda_handler(None, {'a': 1})
loop = asyncio.get_event_loop()
loop.run_forever()
run_in_executor()
import asyncio
import requests
def call_rest_api(data):
print('Triggered REST API in background')
response = requests.get(data['url'])
print('Response: %s' % response)
async def main(loop):
print('Some operations here...')
data = {'url': 'http://example.com#some_rest_api'}
loop.run_in_executor(None, call_rest_api, data)
print('Continue work of main thread...')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
的示例(如果您需要同步调用API)但是如果要编写同步代码,则不必使用asyncio。
await
您能否提供更详细的示例说明您拥有什么以及想要实现什么?