zoukankan      html  css  js  c++  java
  • 协程与异步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))
  • 相关阅读:
    (模板)高斯消元法模板
    poj1797(dijstra变形,求最小边的最大值)
    poj2253(floyd变形)
    (模板)poj2387(dijkstra+优先队列优化模板题)
    poj1915(双向bfs)
    poj3977(折半枚举+二分查找)
    uva11624 Fire! (bfs预处理)
    codeforces#1152C. Neko does Maths(最小公倍数)
    codeforces#1154F. Shovels Shop (dp)
    codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)
  • 原文地址:https://www.cnblogs.com/sunzhiqi/p/10064835.html
Copyright © 2011-2022 走看看