是否可以在打字稿样式中运行异步python脚本

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (10)

目前我有一个python脚本向微服务发出http请求。该请求平均需要3秒。

这是我的python脚本的总结方式。

def main():
  response = request_to_MS(url)

  # This process does not need the response of the microservice.
  some_process()

  # This is where i actually need a response from the microservice
  do_something_with_response(response)


main()

我希望我的脚本能够继续使用代码并稍后等待请求响应,类似于typescript。

/**
 * I'd like to write this kind of code in python.
 */
function get_data(): Promise<string>{
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('This is resolved');
    })
  })
}

async function main(){
  const data = get_data();
  console.log('Data variable stores my promise ', data);
  // Some process
  [1, 2, 3, 4, 5, 6 ,7 ,8].forEach((x: number) => console.log(x));
  // I need the promise value here
  console.log('En el await', (await data).length)
}


void main();

基本上我正在寻找的是完成过程执行所需的时间和微服务的响应时间重叠,总共可以提供更好的响应时间。

提问于
用户回答回答于

制定request_to_MS(url)一个async def协同例程,将其作为一项任务安排response = asyncio.create_task(request_to_MS(url))

它将开始执行。现在你可以继续跑了some_process()。如果需要response,只需做

do_something_with_response(await response)

编辑:以上只有在main也是一个时才有效async def,因为你只能await在异步函数中使用s。而不是打电话main(),打电话asyncio.run(main())

共:

async def request_to_MS(url):
    await asyncio.sleep(3)
    return 'some internet data'

async def main():
    response = asyncio.create_task(request_to_MS(url))
    # response is now a Task

    some_process()

    # if response isn't done running yet, this line will block until it is
    do_something_with_response(await response)

asyncio.run(main())

一个重要的警告,some_process不一定是协程,但如果它是一个阻塞函数(由CPU或IO),它将永远不会产生任何循环让response运行。如果它通过IO阻止,请考虑将其设置为协程。如果对它执行的任何低级IO操作没有异步支持,或者它是否受CPU限制,请考虑使用asyncio的run_in_executor

扫码关注云+社区

领取腾讯云代金券