Python 中的 Promise 相当于什么?

use*_*371 9 javascript python promise

我试图了解什么是最好的代码结构或设计模式,可以执行以下操作:

有一个名为的函数get_data将启动套接字连接并开始等待将返回一些数据的特定套接字事件。一旦获得数据,只有该get_data函数才应该返回。

所以在 JS 中,它会非常简单,如下所示:

(请记住,此代码片段只是一个示例,并不意味着是一个工作代码)

const getData = async ()=>{
  return new Promise((resolve, reject)=>{
    const socket = socket()
    socket.on("message", (data)=>{
      resolve(data)
    })
    socket.connect("localhost")
  });
}

const parseData = async () => {
  const data = await getData()
  // do something with the data
}
Run Code Online (Sandbox Code Playgroud)

然而,对于Python,我完全不知道如何达到相同的结果。

我如何将它翻译成Python?这里会使用什么策略?

我现在能想到的唯一办法是这样的:

def get_data():
  socket = socket()
  my_data = None

  @socket.event
  def message(data):
    nonlocal my_data
    my_data = data

  socket.connect("localhost")
  
  while not my_data:
    time.sleep(0.3)
  
  socket.disconnect()
  return my_data

def parse_data():
  data = get_data()
  # do something with the data
Run Code Online (Sandbox Code Playgroud)

use*_*170 10

如果您想将基于回调的 API 转换为 API async,您\xe2\x80\x99 可能正在寻找asyncio.Future.

\n

稍微修改一下你的稻草人代码:

\n
import asyncio\n\ndef get_data():\n    # create a future\n    future = asyncio.Future()\n\n    # create a socket\n    socket = socket()\n\n    # connect callbacks\n    @socket.on("message")\n    def on_message(data):\n        future.set_result(data)\n\n    @socket.on("error")\n    def on_error(error):\n        future.set_exception(error)\n\n    # create a background task that will communicate with the socket\n    # and invoke the callbacks\n    @asyncio.create_task\n    async def communicate():\n        socket.connect(\'localhost\')\n        socket.communicate()\n\n    # return the future\n    return future\n
Run Code Online (Sandbox Code Playgroud)\n

调用get_data将返回一个对象,您可以像函数调用await一样:async

\n
async def parse_data():\n    data = await get_data()\n    # process further\n
Run Code Online (Sandbox Code Playgroud)\n