python asyncio_Python 中的异步编程:Asyncio

 2023-09-07 阅读 28 评论 0

摘要:异步和同步的代码对比 现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同。在第一个脚本里,我会用标准的 time.sleep 方法,在第二个脚本里使用 asyncio.sleep 的异步方法。 这里使

异步和同步的代码对比

现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同。在第一个脚本里,我会用标准的 time.sleep 方法,在第二个脚本里使用 asyncio.sleep 的异步方法。

这里使用 Sleep 是因为它是一个用来展示异步方法如何操作 I/O 的最简单办法。

使用同步 sleep 方法的代码:import asyncio

import time

from datetime import datetime

python3 asyncio。async def custom_sleep():

print('SLEEP', datetime.now())

time.sleep(1)

async def factorial(name, number):

f = 1

for i in range(2, number+1):

print('Task {}: Compute factorial({})'.format(name, i))

python异步库、await custom_sleep()

f *= i

print('Task {}: factorial({}) is {}\n'.format(name, number, f))

start = time.time()

loop = asyncio.get_event_loop()

tasks = [

asyncio.ensure_future(factorial("A", 3)),

python异步提交数据、asyncio.ensure_future(factorial("B", 4)),

]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

end = time.time()

print("Total time: {}".format(end - start))

脚本输出:Task A: Compute factorial(2)

异步编程实战。SLEEP 2017-04-06 13:39:56.207479

Task A: Compute factorial(3)

SLEEP 2017-04-06 13:39:57.210128

Task A: factorial(3) is 6

Task B: Compute factorial(2)

SLEEP 2017-04-06 13:39:58.210778

Task B: Compute factorial(3)

python 异步、SLEEP 2017-04-06 13:39:59.212510

Task B: Compute factorial(4)

SLEEP 2017-04-06 13:40:00.217308

Task B: factorial(4) is 24

Total time: 5.016386032104492

使用异步 Sleep 的代码:import asyncio

import time

python编程,from datetime import datetime

async def custom_sleep():

print('SLEEP {}\n'.format(datetime.now()))

await asyncio.sleep(1)

async def factorial(name, number):

f = 1

for i in range(2, number+1):

python异步任务?print('Task {}: Compute factorial({})'.format(name, i))

await custom_sleep()

f *= i

print('Task {}: factorial({}) is {}\n'.format(name, number, f))

start = time.time()

loop = asyncio.get_event_loop()

tasks = [

python异步教程,asyncio.ensure_future(factorial("A", 3)),

asyncio.ensure_future(factorial("B", 4)),

]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

end = time.time()

print("Total time: {}".format(end - start))

python异步调用shell?脚本输出:Task A: Compute factorial(2)

SLEEP 2017-04-06 13:44:40.648665

Task B: Compute factorial(2)

SLEEP 2017-04-06 13:44:40.648859

Task A: Compute factorial(3)

SLEEP 2017-04-06 13:44:41.649564

Task B: Compute factorial(3)

python异步处理?SLEEP 2017-04-06 13:44:41.649943

Task A: factorial(3) is 6

Task B: Compute factorial(4)

SLEEP 2017-04-06 13:44:42.651755

Task B: factorial(4) is 24

Total time: 3.008226156234741

从输出可以看到,异步模式的代码执行速度快了大概两秒。当使用异步模式的时候(每次调用 await asyncio.sleep(1) ),进程控制权会返回到主程序的消息循环里,并开始运行队列的其他任务(任务A或者任务B)。

什么是异步编程?当使用标准的 sleep方法时,当前线程会挂起等待。什么也不会做。实际上,标准的 sleep 过程中,当前线程也会返回一个 python 的解释器,可以操作现有的其他线程,但这是另一个话题了。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/18972.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息