python 协程

  1. next send使用
def get_func():
    #1,可以产出值;2,可以接受值(调用方传递进来的值)
    html = yield "http://baidu.com"
    print(html)
    yield 2
    return "bobby"
if __name__ =="__main__"
    gen = get_func()
    #在使用send发送非none值之前,必须要启动一次生成器,方式两种1:send(none),2:next(gen) 
    url = next(gen)
    #启动生成器的两种方式1:next(),2:send()
    print(gen.send("hello world"))#发送的同时生成器向下移动一次
    print(next(gen))
    print(next(gen))#没有生成器时会报错
  1. close 使用
def get_func():
    #1,可以产出值;2,可以接受值(调用方传递进来的值)
    try:
        yield "http://baidu.com"
        #GeneratorExit 继承baseException
    except GeneratorExit:
        pass
    #print(html)
    yield 2
    yield 3
    return "bobby"
if __name__ =="__main__"
    gen = get_func()
    next(gen)
    gen.close()
    next(gen)
  1. close 使用
def get_func():
    #1,可以产出值;2,可以接受值(调用方传递进来的值)
    yield "http://baidu.com"
    #print(html)
    yield 2
    yield 3
    return "bobby"
if __name__ =="__main__"
    gen = get_func()
    next(gen)
    gen.throw(Exception,"download error")
    next(gen)
    gen.throw(Exception,"download error")


  1. yield_from

python3.3 新加语法
from itertools import chain
my_list = [1,2,3]
my_dict = {
    "key1":"value1",
    "key2":"value2"
}
#直接循环输出
#for value in chain(my_list,my_dict,range(2,5)):
#   print(value)
#控制输出
def my_chain(*args,**kwargs):
    for my_iterable in args
        yield from my_iterable
for value in my_chain(my_list,my_dict,range(2,5)):
    print(value)
def g1(gen):
    yield from gen
def main():
    g = g1()
    g.send(none)
# main调用方,g1委托生成器,gen子生成器
# yield from 会在调用方与子生成器之间建立一个双向通道
  1. async await 协程
async  def my_function(url):
    return url
async def func_test(url):
    await my_function(url)

异步,解决高并发问题

  1. 事件循环
import acyncio
import time
async def get_html(url):
    print("start get url")
    await asyncio.sleep(2)#如果是mysql,redis需要异步库操作
    print("end get url")
if __name__ == "__main__":
    sart_time = time.time()
    loop = asyncio.get_event_loop()
    tasks = [get_html("baidu.com") for i in range(10)]
    loop.run_until_complete(asyncio.wait(tasks))
    print(time.time()-start_time)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值