# coding:utf-8
# 异步的关键字 async, await
# async 的功能介绍:代表定义异步,无论多线程,多进程还是异步,都是对函数进行才做,所以想要函数异步,就需要在函数前面加上 async ;
# await 当定义了异步函数后,需要使用await关键字来执行异步函数
# asyncio模块 的 gather 与 run 函数的使用
# gather 将异步函数批量执行,参数 async fun, 返回List
# run 执行主异步函数,
# 异步案例
import time
import random
import asyncio
async def test_a():
for i in range(5):
_s_t = time.time()
# asyncio.sleep() 也是异步的,前面需要加上await
await asyncio.sleep(random.random() * 2)
_e_t = time.time()
print('test_a()方法的第 {} 次循环,随机休眠时间{}'.format(i, _e_t - _s_t))
return 'test_a 运行结束'
async def test_b():
for i in range(5):
_s_t = time.time()
# asyncio.sleep() 也是异步的,前面需要加上await
await asyncio.sleep(random.random() * 2)
_e_t = time.time()
print('test_b()方法的第 {} 次循环,随机休眠时间{}'.format(i, _e_t - _s_t))
return 'test_b 运行结束'
# 主函数
async def main():
res = await asyncio.gather(test_a(), test_b())
print(res)
if __name__ == "__main__":
asyncio.run(main())
# coding:utf-8
# 异步关键字与gevent包 -- 2
# 第三方异步包 gevent , 常用函数
# spawn 创建协程对象 ,参数Fun, args,返回协程对象
# joinall 批量处理协程对象,参数是一个列表;
import time
import gevent
import random
import os
def gevent_test_a():
for i in range(5):
s_time = time.time()
gevent.sleep(random.random() *2)
e_time = time.time()
print('gevent_test_a 方法的第 {} 次循环,耗时{}s,进程号:{}'.format(i, s_time - e_time, os.getpid()))
return "a方法运行结束"
def gevent_test_b():
for i in range(5):
s_time = time.time()
gevent.sleep(random.random() * 2)
e_time = time.time()
return "b方法运行结束"
if __name__ == '__main__':
start_time = time.time()
# gevent.spawn() 创建协程对象
g_test_a = gevent.spawn(gevent_test_a)
g_test_b = gevent.spawn(gevent_test_b)
# gevent.joinall(List) 批量处理协程对象
res = gevent.joinall([g_test_a, g_test_b])
print('结果:', res)
for j in res:
print(j.value)
# 获取协程状态
# started属性 / ready() 方法:判断协程是否已启动。
# successful() 方法:判断协程是否成功运行且没有抛出异常。
# value属性:获取协程执行完之后的返回值。
# 另外,greenlet协程运行过程中发生的异常是不会被抛出到协程外的,因此需要用协程对象的”exception”属性来获取协程中的异常。
#
end_time = time.time()
print('总耗时:', end_time - start_time)