协程模块asyncio

协程模块asyncio

简单写了下读了协程后的总结,下述内容对于基本使用是足够的。
其他的线程池、进程、队列等其他扩展,以后再补充。

理论

1、事件循环里,协程方法(task、future)都是future对象。
2、将所有future注册进IO事件循环里,阻塞监听,触发future的回调。

asyncio主要对象

基础

Run an event loop

1、 run_until_complete(future)
运行future对象,直到完成,事件循环结束
2、run_forever()
除非调用stop,否则将一直运行

两者的区别就是第一个执行完就停止事件循环,第二个是必须调用stop才会停止事件循环

Call

1、call_son()
回调一个函数,这个函数不用声明为协程对象

Futures

1、create_future()
创建一个future对象

Tasks

1、create_task(coro)
使用future对象包装

task和future的最大区别:
future是在一个task里的回调或者是下一步操作,future的概念是在task里面;
task是任务,多个任务同时在一个事件循环里执行;

Creating connections

1、create_connection
创建socket连接,client;

Creating listening connections

1、create_server
创建绑定到主机和端口的TCP服务器(套接字类型SOCK_STREAM);

Watch file descriptors

1、add_reader(fd,callback,*args)
观察文件描述符读取可用性,然后调用指定参数的回调;

2、remove_reader(fd)
停止观看文件描述器读取可用性。

gather

自给定的协程对象或futures返回一个future汇总结果。
所有futures必须共享相同的事件循环。

实例

协程跑一个任务,运行完停止
1
2
3
4
5
6
7
8
9
10
import asyncio

async def say_hello(what, when):
print("开始:???")
await asyncio.sleep(when)
print(what)

loop = asyncio.get_event_loop()
loop.run_until_complete(say_hello("hello", 10))
loop.close()

协程跑多个任务,运行完不停止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import asyncio

async def say_future(when):
await asyncio.sleep(when)
return when

async def say_hello(what, when, loop):
'''
:param what: 内容
:param when: 延迟时间
:param loop: 事件循环对象,在这里用来调用stop方法
'''
print("开始:{}".format(what))
res = await say_future(when)

print(what)
print("{}结果:{}".format(what, res))
if "yy" in what:
loop.stop()

loop = asyncio.get_event_loop()
loop.create_task(say_hello("world", 8, loop))
loop.create_task(say_hello("python", 5, loop))
loop.run_forever()
loop.close()

协程跑多个任务,运行完停止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import asyncio

# 回调函数
async def say_future(when):
await asyncio.sleep(when)
return when

# 改变数据格式
async def change_format(what):
# 用来测试
return "本次执行-{}".format(what)



async def say_hello(what, when):
'''
:param what: 内容
:param when: 延迟时间
:param loop: 事件循环对象,在这里用来调用stop方法
'''
print("开始:{}".format(what))

res = await say_future(when)
what = await change_format(what)
print(what)
print("{}结果:{}".format(what, res))

loop = asyncio.get_event_loop()
# 任务列表
tasks = [
loop.create_task(say_hello("world", 8, )),
loop.create_task(say_hello("python", 5, ))
]

# loop.run_forever()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

本文标题:协程模块asyncio

文章作者:HT

发布时间:2018年03月28日 - 11:03

最后更新:2018年03月28日 - 12:03

原始链接:http://7ht.gitee.io/2018/03/28/协程模块asyncio/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。