如何在不使用 async/await 或 @coroutine/yield 语法的情况下在 python 中创建异步函数

问题描述 投票:0回答:0

考虑以下使用异步函数的 python 脚本。

import asyncio

async def producer(c):
    for i in range(10):
        await c.put(i)
        await asyncio.sleep(1)

    await c.put(None)

async def consumer(c):
    while True:
        value = await c.get()
        
        if value == None: break
        print(value)

async def main():
    c = asyncio.Queue()

    await asyncio.gather(
        producer(c),
        consumer(c)
    )

asyncio.run(main())

这很好,但我处于一种情况,我需要异步函数并且我只能使用函数而不是语法。特此使用 async/await 或 @coroutine/yield from 是不允许的,但我可以使用

asyncio
.

中的函数

我在想这样的事情,其中

await_
函数充当
await
的函数形式 &
async_
将普通函数转换为异步函数。

import asyncio

def producer(c):
    for i in range(10):
        await_(c.put, i)
        await_(asyncio.sleep, 1)

    await_(c.put, None)

def consumer(c):
    while True:
        value = await_(c.get)

        if value == None: break
        print(value)

def main():
    c = asyncio.Queue()

    await_(asyncio.gather(
        async_(producer, c)(),
        async_(consumer, c)()
    ))

asyncio.run(async_(main)())

如果你有兴趣,我正在构建一个 lisp 方言,我想要异步的东西作为一个模块,比如 Clojure 的

clojure.core.async
。所以不要问这方面的问题。

事实上,我的终点是创造

async/>!
async/<!
async/chan
async/go
。所以如果有一些方法,实施这些比
await_
&
async_
,valla 更容易。我希望他们像下面这样工作。

def add(x, y):
    c = chan()
    go(lambda: put(c, x + y))

    return c

c = add(1, 2)
print(get(c))

我已经查看了以下 stackoverflow 帖子。没有一个是我想要的。

  1. 如何在不等待的情况下调用异步函数?
  2. 如何在 python lambda 中使用 await

我知道 ChatGPT 是一个东西,我用它来解决这个问题,但它不够聪明,无法征服世界,但它提供了解决方案,我要么使用使用异步/等待和@coroutine/yield 的内部函数或者那些根本不起作用的。

python asynchronous async-await python-asyncio
© www.soinside.com 2019 - 2024. All rights reserved.