考虑以下使用异步函数的 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 帖子。没有一个是我想要的。
我知道 ChatGPT 是一个东西,我用它来解决这个问题,但它不够聪明,无法征服世界,但它提供了解决方案,我要么使用使用异步/等待和@coroutine/yield 的内部函数或者那些根本不起作用的。