zoukankan      html  css  js  c++  java
  • Python学习之eventlet.greenpool

      该模块提供对 greenthread 池的支持。

      greenthread 池提供了一定数量的备用 greenthread ,有效限制了孵化 greenthread 过多导致的内存不足,当池子中没有足够的空闲 greenthread 时,孵化过程被暂停,只有当先前工作中的 greenthread 完成当前工作,才能为下一个任务做孵化准备。

       本模块包括两个类:

      1. eventlet.greenpool.GreenPool

      2. eventlet.greenpool.GreenPile

    一、 class eventlet.greenpool.GreenPool(size=1000) 

      该类的对象是 green threads 的池子,默认容量是1000个green threads。

    该类的方法

      1. free()

      2. imap(function, *iterables)

      3. resize(new_size)

      4. running()

      5. spawn(function, *args, **kwargs)

      6. spawn_n(function, *args, **kwargs)

      7. starmap(function, iterable)

      8. waitall()

      9. waiting()

    1.

    free() 

      返回当前对象中可用的greenthreads。

      如果为 0 或更少,那么 spawn() 和 spawn_n() 将会阻塞调用 greenthread 直到有新的可用的 greenthread 为止。

      至于为什么此处可能返回负值,请查看3. resize()

    2.

    imap(function, *iterables)  

      效果等同于 itertools.imap() ,在并发和内存使用上等同于 starmap() 。

      例如,可以非常方便地对文件做一些操作:

    def worker(line):
        return do_something(line)
    pool = GreenPool()
    for result in pool.imap(worker, open("filename", 'r')):
        print(result)

    3. 

    resize(new_size) 

      改变当前允许同时工作的 greenthreads 最大数量

      如果当前有多于 new_size 的 greenthreads 处于工作中,它们可以完成自己的执行,只不过此时不许任何的新 greenthreads 被分配。只有当足够数量的 greenthreads 完成自己的工作,然后工作中的 greenthreads 总数低于 new_size 时,新的 greenthreads 才能被分配。在此之前,free() 的返回值将会使负的。 

    4.

    running()

      返回当前池子中正在执行任务的 greenthreads 。

    5.

    spawn(function, *args, **kwargs) 
        
      从当前的池子中孵化一个可用的greenthread,在这个 greenthread 中执行 function ,参数 *args, **kwargs 为传给 function 的参数。返回一个 GreenThread 对象,这个对象执行着 function ,可以通过该 GreenThread 对象获取 function 的返回值。
      如果当前池子中没有空余的 greenthread ,那么该方法阻塞直到有新的可用的 greenthreads 被释放。
      该函数可以重用, function  可以调用同一个 GreenPool 对象的 spawn 方法,不用担心死锁。
        
    6.
    spawn_n(function, *args, **kwargs) 
      
      创建一个 greenthread 来运行 function,效果等同于 spawn()。 只不过这个函数返回 None,即丢弃 function 的返回值。 
     
    7.
    starmap(function, iterable)
      
      等同于 itertools.starmap()除了对于可迭代对象中的每一个元素,都会在一个 greenthread 里面执行 func 。 并发的上限由池子的容量限制。在实际的操作中, starmap() 消耗的内存与池子的容量成比例,从而格外适合遍历特别长的输入列表。 
      
    8.
    waitall()
      
      等待池子中的所有 greenthreads 完成工作。
      
    9.
    waiting()
      
      返回当前等待孵化的 greenthreads 数。
      
    二、
    class eventlet.greenpool.GreenPile(size_or_pool=1000)  
      
      GreenPile 是一些I/O相关任务的抽象。
      可以使用一个已经存在的 GreenPool 对象构造一个 GreenPile ,这个 GreenPile 在处理自己的任务时将会用那个池子的并发。一个 GreenPool 可以对应多个 GreenPile。
      一个 GreenPile 也可以独立构造,不与任何 GreenPool 绑定。只需要在创建实例时传入一个整数作为参数即可。
      使用不是当前调用 spawn() 的 greenthread 迭代一个 GreenPile 并不明智,迭代器将会过早的退出。 
      
    该类的方法有
    1.  next() 

    等待下一个结果,挂起当前的 greenthread 直到结果可用为止。 当没有更多的结果时,抛出 StopIteration 异常。

    2.  spawn(func, *args, **kw) 

    在它自己的 greenthread 中运行 func,结果储存在 GreenPile 对象中,可以迭代该对象获取这些结果。

  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/zmlctt/p/4227401.html
Copyright © 2011-2022 走看看