《流畅的python》读书笔记(九)
15.1 if 语句之外的else
for—else, while—else当循环正常结束的时候执行,与break互斥.
15.3 contextlib
把生成器函数变成上下文管理器
import sys
from contextlib import contextmanager
@contextmanager
def glass_looking():
"""镜面效果的生成器函数"""
orgin_print = sys.stdout.write
reverse_print = lambda text: orgin_print(text[::-1])
sys.stdout.write = reverse_print
yield "python交流微信:77245741"
sys.stdout.write = orgin_print
if __name__ == '__main__':
with glass_looking() as w:
print("123456")
print(w)
print("123456")
16.7 yirld from
合并可迭代对象和生成器
def chain(seq, gen):
"""合并生成器"""
yield from seq
yield from gen
g = chain("123", range(4,9))
print(list(g))
yield from 对象遍历完成后会把yield存入StopIteration.value中而不会抛出异常.
16.9 协程应用
用协程做计算机事件仿真.
生成器有三种不同的风格: 拉取式,推送式,任务式.
协程显式自主的把控制权交给中央调度程序, 多线程是抢占式获取控制权.
asyncio的用户代码中只出现yield from, next()和send()封装在底层.
python的协程库simpy, 既可以用于模拟仿真,也可以用于真实通信.
python3废弃了print和exec关键字, 新增了None, True, False, nonlocal
python3.5新增关键字await, async
17.2 futures
线程池和进程池是futures中最常用的两个类.
from concurrent.future import ThreadPoolExcutor, ProcessPoolExcutor
with ThreadPoolExcutor(max_workers) as workers:
woorkers.map(func, seq)
17.5 concurrent.futures.as_complated()
返回一个迭代器, 在future运行结束后返回future
18.1 asyncio.Future
一般情况下asyncio.Future通过yield from驱动,而不是.done(), .add_done_callback()和.result()
异步协程
@asyncio.coroutine
def func()
r1 = yield from work1()
r2 = yield from work2(r1)
return r2
DEMO2
def download(self):
loop = asyncio.get_event_loop()
tasks = [self.download_page(url) for url in self.urls]
loop.run_until_complete(asyncio.wait(tasks))
DEMO3
# coding:utf-8
import asyncio
import time
async def work(i):
print("start work", i)
await asyncio.sleep(2)
if __name__ == "__main__":
start_time = time.time()
loop = asyncio.get_event_loop()
coros = []
for i in range(3):
coros.append(work(i))
loop.run_until_complete(asyncio.gather(*coros))
DEMO4
# coding: utf-8
import asyncio
import time
from functools import partial
async def work(url):
print("start work")
await asyncio.sleep(2)
def callback(p, future):
print("callback", p)
time.sleep(2)
def callback1(p, future):
print("callback1", p)
time.sleep(2)
if __name__ == "__main__":
start_time = time.time()
loop = asyncio.get_event_loop()
tasks = []
for i in range(3):
task = loop.create_task(work(i))
task.add_done_callback(partial(callback, "1111"))
task.add_done_callback(partial(callback1, "2222"))
tasks.append(task)
print("start", time.time())
loop.run_until_complete(asyncio.gather(*tasks))
print("finish", time.time())
协程编程可能会是python的趋势.