设为首页 收藏本站
查看: 1185|回复: 0

[经验分享] Python——eventlet.greenpool

[复制链接]

尚未签到

发表于 2015-11-30 14:31:36 | 显示全部楼层 |阅读模式
  该模块提供对 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 对象中,可以迭代该对象获取这些结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145456-1-1.html 上篇帖子: Python属性、方法和类管理系列之 下篇帖子: python提取隐含结构的字符串
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表