forked from xianhu/LearnPython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpython_coroutine.py
More file actions
77 lines (61 loc) · 3.07 KB
/
python_coroutine.py
File metadata and controls
77 lines (61 loc) · 3.07 KB
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# _*_ coding: utf-8 _*_
"""
python_coroutine.py by xianhu
"""
import asyncio
import aiohttp
import threading
# 生产者、消费者例子
def consumer(): # 定义消费者,由于有yeild关键词,此消费者为一个生成器
print("[Consumer] Init Consumer ......")
r = "init ok" # 初始化返回结果,并在启动消费者时,返回给生产者
while True:
n = yield r # 消费者通过yield关键词接收生产者产生的消息,同时返回结果给生产者
print(f"[Consumer] conusme n = {n}, r = {r}")
r = f"consume {n} OK"
def produce(c): # 定义生产者,此时的 c 为一个生成器
print("[Producer] Init Producer ......")
r = c.send(None) # 启动消费者生成器,同时第一次接收返回结果
print(f"[Producer] Start Consumer, return {r}")
for n in range(1, 6):
print(f"[Producer] While, Producing {n} ......")
r = c.send(n) # 向消费者发送消息,同时准备接收结果。此时会切换到消费者执行
print(f"[Producer] Consumer return: {r}")
c.close() # 关闭消费者生成器
print("[Producer] Close Producer ......")
# produce(consumer())
# 异步IO例子:适配Python3.4,使用asyncio库
@asyncio.coroutine
def hello(index): # 通过装饰器asyncio.coroutine定义协程
print(f'Hello world! index={index}, thread={threading.currentThread()}')
yield from asyncio.sleep(1) # 模拟IO任务
print(
f'Hello again! index={index}, thread={threading.currentThread()}'
) @ asyncio.coroutine
loop = asyncio.get_event_loop() # 得到一个事件循环模型
tasks = [hello(1), hello(2)] # 初始化任务列表
loop.run_until_complete(asyncio.wait(tasks)) # 执行任务
loop.close() # 关闭事件循环列表
# 异步IO例子:适配Python3.5,使用async和await关键字
async def hello1(index): # 通过关键字async定义协程
print(f'Hello world! index={index}, thread={threading.currentThread()}')
await asyncio.sleep(1) # 模拟IO任务
print(f'Hello again! index={index}, thread={threading.currentThread()}')
loop = asyncio.get_event_loop() # 得到一个事件循环模型
tasks = [hello1(1), hello1(2)] # 初始化任务列表
loop.run_until_complete(asyncio.wait(tasks)) # 执行任务
loop.close() # 关闭事件循环列表
# aiohttp 实例
async def get(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
print(url, resp.status)
print(url, await resp.text())
loop = asyncio.get_event_loop() # 得到一个事件循环模型
tasks = [ # 初始化任务列表
get("http://zhushou.360.cn/detail/index/soft_id/3283370"),
get("http://zhushou.360.cn/detail/index/soft_id/3264775"),
get("http://zhushou.360.cn/detail/index/soft_id/705490")
]
loop.run_until_complete(asyncio.wait(tasks)) # 执行任务
loop.close() # 关闭事件循环列表