风火编程--上下文管理装饰器, yield from合并生成器, 协程asyncio

《流畅的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的趋势.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值