1、同步代码:
import time
def run(index):
print("lucky is a good man", index)
time.sleep(2)
print("lucky is a nice man", index)
for i in range(1, 5):
run(i)
运行结果:
lucky is a good man 1
lucky is a nice man 1
lucky is a good man 2
lucky is a nice man 2
lucky is a good man 3
lucky is a nice man 3
lucky is a good man 4
lucky is a nice man 4
2、异步执行
import time
import asyncio
async def run(i):
print("lucky is a good man", i)
# 模拟一个耗时IO
await asyncio.sleep(2)
print("lucky is a nice man", i)
if __name__ == "__main__":
# loop = asyncio.get_event_loop() 此方法已弃用,使用会报错
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
tasks = []
t1 = time.time()
for url in range(1, 5):
coroutine = run(url)
task = asyncio.ensure_future(coroutine)
tasks.append(task)
loop.run_until_complete(asyncio.wait(tasks))
t2 = time.time()
# %.2f 是固定格式,表示保留两位小数
print("总耗时:%.2f" % (t2 - t1))
运行结果:
lucky is a good man 1
lucky is a good man 2
lucky is a good man 3
lucky is a good man 4
lucky is a nice man 1
lucky is a nice man 3
lucky is a nice man 2
lucky is a nice man 4
总耗时:2.01
3、简单异步:
import asyncio
async def run():
print('run函数开始')
# 这个位置的asyncio.sleep() 用于携程对象中的阻塞等待
await asyncio.sleep(2)
print('run函数结束')
if __name__ == '__main__':
con = run()
asyncio.run(con)
运行结果:
run函数开始
run函数结束
4、多任务同步:
import time
def run(url):
print(f'开启请求{url}的数据')
time.sleep(2)
print(f'结束请求{url}的数据')
data = url + '的抓取数据'
return data
if __name__ == '__main__':
url_list = ['baidu.com', 'taobao.com', 'aqiyi.com']
for i in url_list:
run(i)
运行结果:
开启请求baidu.com的数据
结束请求baidu.com的数据
开启请求taobao.com的数据
结束请求taobao.com的数据
开启请求aqiyi.com的数据
结束请求aqiyi.com的数据
5、协程多任务:
import time
import asyncio
async def run(url):
print(f'开启请求{url}的数据')
await asyncio.sleep(2)
print(f'结束请求{url}的数据')
data = url + '的抓取数据'
return data
# 接收返回值
def call_back(f):
print(f.result())
if __name__ == '__main__':
t1 = time.time()
# loop = asyncio.get_event_loop() # 此方法已弃用
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
url_list = ['baidu.com', 'taobao.com', 'aqiyi.com']
tasks = [] # 包含多个task任务的对象
for i in url_list:
con = run(i)
# 开启消息循环
task = asyncio.ensure_future(con)
# 添加回调函数
task.add_done_callback(call