如何在asyncio中复制线程代码?



我已经使用threading很多年了,但它过时了,可能有很好的理由。因此,我试图理解这个东西是如何工作的。

我用threading的解

考虑以下threading代码:

import threading
import time
def say_wait_10():
print("from say_wait_10 start")
time.sleep(10)
print("from say_wait_10 end")
def say():
print("from say")
threading.Thread(target=say_wait_10).start()
threading.Thread(target=say).start()

这个想法是启动一个需要时间的任务(say_wait_10()),让它自己运行,并并行启动一个短暂的任务(say()),它也自己运行。它们是独立的,一个不阻塞另一个(这可能是或多或少有效取决于任务是CPU密集型还是I/O密集型)。

输出如下所示

from say_wait_10 start
from say
from say_wait_10 end

我尝试了asyncio

我现在试图将其转换为asyncio,遵循文档。我想到了

import asyncio
async def say_wait_10():
print("from say_wait_10 start")
await asyncio.sleep(10)
print("from say_wait_10 end")
async def say():
print("from say")
async def main():
await asyncio.create_task(say_wait_10())
await asyncio.create_task(say())
asyncio.run(main())
我对上面代码的理解是,asyncio.create_task(say_wait_10())创建了一个任务,该任务立即开始自己运行await相当于threading.Thread.join(),以确保主代码等待协程(或上面示例中的任务)有时间完成。

输出为

from say_wait_10 start
from say_wait_10 end
from say
啊,所以任务中的代码同步运行只有在它完成之后,才会调用say()

。异步部分在哪里?我当时想,也许await实际上意味着"等待"。(为了在进一步完成任务之前完成)所以我删除了它,但这只是启动程序,运行主程序执行期间可运行的任何内容,然后它结束

from say_wait_10 start
from say

我的问题如何复制我的threading代码-我真的非常感谢在代码中发生的事情的解释,这样我可以在进一步了解asyncio之前掌握哲学。

或者,一个指导我从threadingasyncio的教程指针将是很棒的。

注意

如果这能帮助我,我对JS中的Promises的想法没有任何问题,尽管我对JS只有非常肤浅的理解(也就是说,比我对Python的理解更肤浅——我只是一个业余的开发人员)。在JS中,由于代码运行的地方,我没有问题去想象这样一个事实:"事情发生时发生,然后他们更新DOM的某些部分(这是我的典型用途))

await是你的问题。await是阻塞的,所以你不调度say,直到say_wait_10之后。有几种方法可以实现你想要的。

第一个是

的变体
task = create_task(say_wait_10())
await say()
await task

如果你有两个以上的任务,这就有点乱了,你很难控制它们花费的时间。另一个选项是

await gather(say_wait_10(), say())

相关内容

  • 没有找到相关文章

最新更新