• 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 对象中,可以迭代该对象获取这些结果。

  • 相关阅读:
    C# 编码约定
    SQL 合并多列为一行字符串
    Flex 粒子效果
    安装flashplayer 提示 "您尝试安装的 Adobe Flash Player" 版本不是最新版本. 请访问 Player 下载中心 获取最新、最安全版本"的解决方法
    Flex Builder 好用的插件
    【默认】博客正式开通
    Vulkanished2021重要内容简介
    论文读书笔记8
    论文读书笔记5
    论文读书笔记2
  • 原文地址:https://www.cnblogs.com/zmlctt/p/4227401.html
Copyright © 2020-2023  润新知