gevent
--常用功能#
最常见的函数和类在 gevent
顶级套餐。
请阅读 介绍 介绍这里讨论的概念。
参见
- __version__ = '24.2.1'#
人可读的PEP 440版本标识符。使用
pkg_resources.parse_version(__version__)
或packaging.version.Version(__version__)
以获得机器可用值。
与Greenlets合作#
见 gevent.Greenlet
有关greenlet对象的更多信息。
创建greenlet#
- spawn(function, *args, **kwargs) Greenlet #
创建新的
Greenlet
对象并计划其运行function(*args, **kwargs)
. 这个可以用作gevent.spawn
或Greenlet.spawn
.参数传递给
Greenlet.__init__()
.在 1.1b1 版本发生变更: 如果A 功能 如果是不可调用的,则立即引发
TypeError
而不是生成一个将引发未捕获类型错误的greenlet。
- spawn_later(seconds, function, *args, **kwargs) Greenlet #
创建并返回新的
Greenlet
计划运行的对象function(*args, **kwargs)
在未来的循环迭代中 秒 稍后。这个可以用作Greenlet.spawn_later
或gevent.spawn_later
.参数传递给
Greenlet.__init__()
.在 1.1b1 版本发生变更: 如果要成为函数的参数(中的第一个参数 args ,或者
run
关键字)提供给这个classmethod(而不是子类的classmethod),它被验证为可调用的。以前,当它开始运行时,生成的greenlet会失败。
- spawn_raw(function, *args, **kwargs)[源代码]#
创建新的
greenlet.greenlet
对象并计划其运行function(*args, **kwargs)
.这将返回一个原始
greenlet
它没有所有有用的方法gevent.Greenlet
有。通常,应用程序应该更喜欢spawn()
但是,如果涉及到许多greenlet,这个方法有时可能作为一个优化有用。在 1.1a3 版本发生变更: 验证
function
可调用,否则引发类型错误。以前,繁殖的绿叶树在第一次被切换到时就会失败。在 1.1b1 版本发生变更: 如果 功能 不可调用,立即提升
TypeError
而不是生成一个将引发未捕获类型错误的greenlet。在 1.1rc2 版本发生变更: 接受关键字参数
function
如之前(错误地)记录的。请注意,这可能会产生额外的费用。在 1.3a2 版本发生变更: 填充
spawning_greenlet
和spawn_tree_locals
返回的greenlet的属性。在 1.3b1 版本发生变更: Only 填充
spawning_greenlet
和spawn_tree_locals
如果GEVENT_TRACK_GREENLET_TREE
已启用(默认)。如果未启用,则不会设置这些属性。在 1.5a3 版本发生变更: 返回的绿色小菜总是有一个 loop 与当前中心的循环匹配的属性。gevent api有助于更好地工作。
获得绿叶树#
- getcurrent()#
返回当前正在执行的greenlet(调用此函数的greenlet)。请注意,这可能是
Greenlet
或greenlet.greenlet
.
停止Greenlets#
- kill(greenlet, exception=GreenletExit)[源代码]#
异步杀死greenlet。目前的绿let不是计划外的。
备注
方法
Greenlet.kill()
方法执行相同和更多的操作(这里列出的警告同样适用)。然而,最初存在的主要绿地没有kill()
方法,也不使用spawn_raw()
,因此必须使用此函数。小心
杀小菜时要小心。如果他们没有为异常做好准备,这可能会导致损坏状态。
在 1.1a2 版本发生变更: 如果
greenlet
有一个kill
方法,调用它。这就阻止了绿let在被杀死但还没有被执行之后第一次被切换到绿let。
- killall(greenlets, exception=GreenletExit, block=True, timeout=None)[源代码]#
强制终止所有 绿片 使他们提高 例外 .
小心
杀小菜时要小心。如果他们没有为异常做好准备,这可能会导致损坏状态。
- 参数:
greenlets -- A 有界的 无法终止非非无Greenlet。 All 此iterable中的项必须是属于同一集线器的greenlet,该集线器应该是当前线程的集线器。如果这是一个转换greenlet的生成器或迭代器,那么结果是未定义的。
exception -- 在绿色区域中引发的异常类型。默认情况下是
GreenletExit
.block (bool) -- 如果为真(默认值),则此函数仅在所有greenlet都已关闭时返回;在此过程中,当前greenlet未计划。如果greenlets忽略在它们中引发的初始异常,那么它们将被加入(与
gevent.joinall()
)自然死亡。如果为false,则此函数立即返回,greenlet将异步引发异常。timeout (float) -- 以秒为单位等待格林莱特死去的时间。如果给予,只有在
block
是True。
- 抛出:
Timeout -- 如果阻塞和超时是给定的,在所有的小菜都死之前就已经过去了。
在 1.1a2 版本发生变更: 绿片 可以是greenlet的任何iterable,比如迭代器或集合。以前它必须是一个列表或元组。
在 1.5a3 版本发生变更: 任何
Greenlet
在 绿片 调用此方法之前未切换到的列表将永远不会切换到。这使得该函数的行为类似于Greenlet.kill()
. 这不适用于生青菜。在 1.5a3 版本发生变更: 现在接受由
gevent.spawn_raw()
.
睡觉#
- sleep(seconds=0, ref=True)[源代码]#
至少让现在的绿叶树睡觉 秒 .
秒 可以指定为整数,也可以指定为浮点(如果需要小数秒)。
小技巧
在当前的实现中,值为0(默认值)意味着将执行权让给任何其他可运行的greenlet,但此greenlet可能会在事件循环周期之前再次调度(在极端情况下,重复使用0休眠的greenlet可以阻止准备执行I/O的greenlet被安排在一段(小)时间内;另一方面,大于0的值将延迟运行这个greenlet,直到循环的下一次迭代。
如果 ref 是假的,格林莱特跑了
sleep()
不会阻止gevent.wait()
退出。在 1.3a1 版本发生变更: 值为0的睡眠现在将被限制为大约阻塞循环不超过
gevent.getswitchinterval()
.参见
切换#
- getswitchinterval() current switch interval #
-
在 1.3 版本加入.
- setswitchinterval(seconds)#
设置在事件循环循环进行事件轮询之前允许回调函数运行的最长时间。这样可以防止执行以下操作的代码独占循环:
while True: # Burning CPU! gevent.sleep(0) # But yield to other greenlets
在此之前,此代码可能会阻止事件循环运行。
在python 3上,它使用本机
sys.setswitchinterval()
和sys.getswitchinterval()
.在 1.3 版本加入.
等待#
- wait(objects=None, timeout=None, count=None)#
等待 objects 做好准备或等待事件循环结束。
如果 objects 则它必须是包含实现等待协议的对象(rawlink()和unlink()方法)的列表:
如果 objects 是
None
(默认设置),wait()
阻塞,直到当前事件循环无事可做(或直到 timeout 传球):所有小菜都吃完了
所有服务器都已停止
所有事件循环观察程序都已停止。
如果 count 是
None
(默认设置),等待所有 objects 做好准备。如果 count 是一个数字,等待(最多) count 对象准备就绪。(例如,如果Count为
1
然后,当列表中的任何对象就绪时,该函数退出)。如果 timeout 时,它指定最大秒数
wait()
将会被阻止。按准备就绪的顺序返回准备就绪对象的列表。
参见
- iwait(objects, timeout=None, count=None)#
迭代收益率 物体 当他们准备好了,直到全部(或 计数 )准备好了或者 超时 期满。
如果你只消费 物体 ,您应该在
with
阻止此对象以避免泄漏资源:with gevent.iwait((a, b, c)) as it: for i in it: if i is a: break
- 参数:
参见
在 1.1a1 版本发生变更: 添加 计数 参数。
在 1.1a2 版本发生变更: 不再加薪
LoopExit
如果调用方在该函数生成的项之间切换greenlet。在 1.4 版本发生变更: 添加支持以将返回的对象用作上下文管理器。
使用多个进程#
备注
这些功能仅在以下情况下可用: os.fork()
可用。一般来说,更喜欢使用 gevent.os.fork()
而不是手动调用这些函数。
- fork(*args, **kwargs)[源代码]#
分叉子进程并在父进程中为其启动子观察程序,以便
waitpid
Sigchld按预期工作。本次实施
fork
是包装fork_and_watch()
当环境变量GEVENT_NOWAITPID
是 not 定义。这是默认值,大多数应用程序都应该使用它。在 1.1b2 版本发生变更.
- reinit() None [源代码]#
准备GEvent轮毂以在新(分叉)过程中运行。
这个应该叫 立即 之后
os.fork()
在子进程中。这是自动完成的gevent.os.fork()
或者如果os
模块已被猴修补。如果在分叉过程中不调用此函数,则症状可能包括挂起socket.getaddrinfo()
而且轮毂的螺纹工具不太可能工作。备注
已注册的fork watcher可以在该函数之前运行,也可以不运行(因此
gevent.os.fork
)返回。如果它们没有运行,它们将在事件循环迭代之后“很快”运行。您可以通过向sleep()
在fork返回后。(从gevent 1.1及之前的版本开始,fork watchers将不会运行,但将来可能会发生变化。)备注
如果可以更顺利地管理fork过程,那么在将来的主要版本中可以删除此功能。
警告
参见中的备注
gevent.os.fork()
关于greenlet和子进程中的事件循环观察程序。
信号#
- signal_handler(signalnum, handler, *args, **kwargs) object #
打电话给 处理程序 与 args 和 关键字参数 当进程接收到信号时 信号符号 .
这个 处理程序 当信号发出时,将以新的绿色通道运行。
这将返回一个具有有用方法的对象
cancel
,这将在调用时阻止 信号符号 来自呼叫 处理程序 . 最好在调用之前保持返回对象的活动状态cancel
.备注
这可能无法正确使用
SIGCHLD
如果使用libev儿童观察程序(默认情况下gevent.os.fork
)见gevent.signal
更通用的解决方案。在 1.2a1 版本发生变更: 这个
handler
参数必须在构造时可调用。在 20.5.1 版本发生变更: 这个
cancel
方法现在正确清理所有本机资源,并删除对该函数所有参数的引用。
超时#
参见课程 gevent.Timeout
有关超时对象的信息。