• 协程与异步IO


    协  程
    协程,又称微线程,纤程。
    协程的优势:
                 协程的特点在于是一个线程执行。
                 协程的最大优势是极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程的
    数量越多,协程的性能优势越明显。
                     第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多 
     
    协程的缺陷:
             1.无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上。当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用   
               2.进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
     
    gevent 能规避阻塞,封存了协程的方法
    gevent的基本使用方法:
    • gevent.spawn(func, *args, ...)方法用来生成协程,他接受一个函数作为参数
    • gevent.joinall([t1, t2, ...])方法用来启动协程轮询并等待运行结果
    • gevent.sleep()用来模拟一个IO操作,阻塞后自动切换到另一个协程执行
     
     
    python 是弱类型语言,开发效率高,代码量小,也是一种脚本语言,可以随时运行      执行效率慢
    IO密集多线程   聊天
    cpu密集用多进程 利用多核资源 端口
     
    进程相对于线程和协程相对困难
    代码:::
    #导包
    import gevent
    #激活协程任务
    from gevent import monkey
    monkey.patch_all()
     
    import urllib.request
    import time
     
    def fetch():
    #抓取网页
    time.sleep(1)
    respose=urllib.request.urlopen("http://www.baidu.com")
    result=respose.read()
     
    def test():
    #同步抓取,非多任务
    for i in range(10):
    fetch()
     
    def test_gevent():
    #异步非阻塞抓取
    gs=[]
    for i in range(10):
    #生成协程
    gs.append(gevent.spawn(fetch))
    #启动协程
    gevent.joinall(gs)
    if __name__ == '__main__':
    start=time.time()
    test()
    print("正常抓取的时间:%s"%(time.time()-start))
    start=time.time()
    test_gevent()
    print("非阻塞抓取的时间是%s"%(time.time()-start))
  • 相关阅读:
    简单工厂模式
    单例模式
    Quartz.NET总结(三)Quartz 配置
    Quartz.NET总结(二)CronTrigger和Cron表达式
    ORACLE跨数据库查询的方法
    github使用个人总结
    ffmpeg 下载安装和简单应用
    Python 安装与环境变量配置
    Sublime text 3 汉化教程
    给大家分享两套WordPress收费主题
  • 原文地址:https://www.cnblogs.com/sunzhiqi/p/10064835.html
Copyright © 2020-2023  润新知