eventlet学习笔记之一:基本概念
本系列文章翻译自英文官方文档,原文请访问官方文档
基本用法
如果这是您第一次使用Eventlet,您可能会发现设计模式文档中的示例是一个很好的起点。
Eventlet是围绕绿色线程(即协程,我们使用术语可互换)的概念构建的,这些概念是为了进行与网络相关的工作而启动的。绿色线程与正常线程的区别主要有两种:
- 绿线非常便宜,几乎是免费的。您不必像普通线程一样保存绿色线程。通常,每个网络连接至少会有一个绿色线程。
- 绿色线程相互合作,而不是先发制人地安排。这种行为的主要优点是共享数据结构不需要锁,因为只有在显式调用yield时,另一个绿色线程才能访问数据结构。还可以检查诸如队列之类的原语以查看它们是否具有任何未决数据。
主要API
Greenthread Spawn
eventlet.spawn(func, *args, **kw)
创建一个绿色线程来执行func函数。多个绿色线程可以并发执行。spawn的返回值是一个greenthread.GreenThread
对象,这个对象可以用来检索func函数的返回值或者异常信息。
eventlet.spawn_n(func, *args, **kw)
功能与spawn类似,但是没有返回值,也不抛异常。执行比spawn更快。
eventlet.spawn_after(seconds, func, *args, **kw)
spawn的延迟执行版本。
注:Spawn是“量产”的意思。
Greenthread 控制
eventlet.sleep(seconds=0)
挂起协程,使得别的协程可以执行。
class eventlet.GreenPool
用池化技术控制并发。使得内存消耗、并发连接数是可控的,并进而为系统中的其他部分预留资源。
class eventlet.GreenPile
(协程堆)
GreenPile对象表示“任务块”。一个GreenPile是一个可以被塞满任务的迭代器,任务的结果会在稍后被读出。
class eventlet.Queue
在协程之间通信、传递数据的工具。
class eventlet.Timeout
在协程中添加超时机制的工具。在指定超时时间后,抛出异常。
打补丁函数
eventlet.import_patched(modulename, *additional_modules, **kw_additional_modules)
eventlet.monkey_patch(all = True,os = False,select = False,socket = False,thread = False,time = False )
导入绿化过的模块。
便利的网络函数
- eventlet.connect(addr, family=<AddressFamily.AF_INET: 2>, bind=None)
- eventlet.listen(addr, family=<AddressFamily.AF_INET: 2>, backlog=50, reuse_addr=True, reuse_port=None)¶
- eventlet.wrap_ssl(sock, *a, **kw)¶
- eventlet.serve(sock, handle, concurrency=1000)
- class eventlet.StopServe