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

时间: 2024-10-10 15:39:07

Python——eventlet.greenpool的相关文章

Python学习之eventlet.greenpool

该模块提供对 greenthread 池的支持. greenthread 池提供了一定数量的备用 greenthread ,有效限制了孵化 greenthread 过多导致的内存不足,当池子中没有足够的空闲 greenthread 时,孵化过程被暂停,只有当先前工作中的 greenthread 完成当前工作,才能为下一个任务做孵化准备. 本模块包括两个类: 1. eventlet.greenpool.GreenPool 2. eventlet.greenpool.GreenPile 一. cla

Python——eventlet

eventlet语境下的“绿色线程”普通线程之间的区别: 1. 绿色线程几乎没有开销,不用像保留普通线程一样保留“绿色线程”,每一个网络连接对应至少一个“绿色线程”: 2. 绿色线程需要人为的设置使其互相让渡CPU控制权,而不是抢占.绿色线程既能够共享数据结构,又不需要显式的互斥控制,因为只有当一个绿色线程让出了控制权后其他的绿色线程才能访问彼此共享的数据结构. 下图是eventlet中协程.hub.线程.进程之间的关系: ____________________________________

Python——eventlet.wsgi

eventlet 的 wsgi 模块提供了一种启动事件驱动的WSGI服务器的简洁手段,可以将其作为某个应用的嵌入web服务器,或作为成熟的web服务器,一个这样的web服务器的例子就是 Spawning. 目录 一.Eventlet 的 WSGI 服务器 1. eventlet.wsgi.server() 2. eventlet.wsgi.format_data_time() 二.SSL 三.Post hooks 四.“100 continue”响应头 一.Eventlet 的 WSGI ser

Python——eventlet.hubs

Hub构成了 Eventlet 的事件循环,它分发 I/O 事件.调度 greenthread.Hub的存在使得协程被提升为 greenthreads. Eventlet 有多种hub的实现,所以在使用之前应该选择最适合自己系统的实现: epolls 要求 Python 2.6 或 python-epoll 包,同时只支持 Linux.这是最快的纯Python hub. poll 所有支持它的平台均可. selects 哪都能用. pyevent 基于libevent的后端,最快!默认是不被支持

Python——eventlet.backdoor

eventlet.backdoor 是正在运行中的进程内的 Pyhon 交互解释器. 该模块便于检测一个长期运行进程的运行状态,提供了一种可以不阻塞应用正常操作的 Pyhon 交互解释器,从而极大地方便了调试.性能调优或仅仅是了解事情是怎么运转的. 在应用中孵化一个协程,这个协程运行一个 backdoor_server ,这个 backdoor_server 中有一个处于监听状态的套接字: eventlet.spawn(backdoor.backdoor_server, eventlet.lis

Python——eventlet.event

该模块提供eventlet的事件支持,事件提供了跨 greenthread 的操作原语. 同一个事件对象既可以发出事件也可以接收(等待)事件,不同的协程共享这一个事件对象,就为不同协程之间基于事件的同步提供了可能. class eventlet.event.Event 该类型抽象了以下事件:任意数量的协程可以等待其他一个协程发出的某一个事件. 事件类似于一个只能容纳一个对象的队列,但是有以下两个方面的区别: 1. 调用 send() 绝不会取消对当前greenthread的调度: 2. send

Python——eventlet.greenthread

该模块实现 eventlet 中的 “绿色线程” 即协程. 相关的 greenlet 模块的介绍. 目录 一.模块级函数 sleep() spawn() 模块级函数 eventlet.greenthread.sleep(seconds=0) 在至少参数 seconds 秒后让出控制权,参数 seconds 可以是一个整数,也可是浮点型的.当参数 seconds 为0时,主动让出控制权,在执行长时间计算时这么做有助于让别的协程也得到执行.  eventlet.greenthread.spawn(f

Python——eventlet.websocket

使用该模块可以方便地创建 websocket 服务器,要创建一个websocket服务器,只需要将一个句柄函数用装饰器 WebSocketWSGI 装饰即可,然后这个函数就可以当做一个WSGI应用: from eventlet import wsgi, websocket import eventlet @websocket.WebSocketWSGI def hello_world(ws): ws.send("hello world") wsgi.server(eventlet.li

练习PYTHON之EVENTLET

以下是重点,要会运用: eventlet是一个用来处理和网络相关的python库函数,而且可以通过协程来实现并发,在eventlet里,把“协程”叫做 greenthread(绿色线程).所谓并发,就是开启了多个greenthread,并且对这些greenthread进行管理,以实现非阻塞式的 I/O.比如说用eventlet可以很方便的写一个性能很好的web服务器,或者是一个效率很高的网页爬虫,这都归功于eventlet的“绿色线程”,以及对“绿色线程”的管理机制.更让人不可思议的是,even