我已经使用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
之前掌握哲学。
或者,一个指导我从threading
到asyncio
的教程指针将是很棒的。
注意
如果这能帮助我,我对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())