zoukankan      html  css  js  c++  java
  • 关于gevent

    首先,gevent是一个网络库:libevent是一个事件分发引擎,greenlet提供了轻量级线程的支持。所以它不适合处理有长时间阻塞IO的情况。

    gevent就是基于这两个东西的一个专门处理网络逻辑的并行库。

    1. gevent.spawn启动的所有协程,都是运行在同一个线程之中,所以协程不能跨线程同步数据。

    2. gevent.queue.Queue 是协程安全的。

    3. gevent启动的并发协程,具体到task function,不能有长时间阻塞的IO操作。因为gevent的协程的特点是,当前协程阻塞了才会切换到别的协程。

    如果当前协程长时间阻塞,则不能显示(gevent.sleep(0),或隐式,由gevent来做)切换到别的协程。导致程序出问题。

    4. 如果有长时间阻塞的IO操作,还是用传统的线程模型比较好。

    5. 因为gevent的特点总结是:事件驱动+协程+非阻塞IO,事件驱动值得是libvent对epool的封装,来基于事件的方式处理IO。

    协程指的是greenlet,非阻塞IO指的是gevent已经patch过的各种库,例如socket和select等等。

    6. 使用gevent的协程,最好要用gevent自身的非阻塞的库。如httplib, socket, select等等。

    7. gevent适合处理大量无阻塞的任务,如果有实在不能把阻塞的部分变为非阻塞再交给gevent处理,就把阻塞的部分改为异步吧。

  • 相关阅读:
    由 Rest参数 和 Spread扩展运算符想到的...
    输出数组重复项
    echarts 踩坑记
    es6 Promise.all() 和 Promise.race() 区别
    关于Promise.all
    移动端弹出层平滑滚动和fix定位的冲突
    ES6 数组和字符串
    IE9以下 placeholder兼容
    jQuery设置聚焦并使光标位置在文字最后
    处理GitHub不允许上传大于100M文件问题
  • 原文地址:https://www.cnblogs.com/huazi/p/2605037.html
Copyright © 2011-2022 走看看