跳转到主要内容

gevent工具库

项目描述

gtools

A python library providing gevent tools

  • a gevent friendly pdb
  • 运行greenlets的树形表示

gevent友好的pdb

标准的python pdb模块在pdb提示符处阻止所有greenlets(与线程应用不同)。如果您想让greenlets在后台运行,可以使用gtools.pdb代替。

它可以像标准pdb一样使用。

所以,想象一下您有一个需要调试的gevent应用

# ======
# app.py
# ======

import gevent

def produce(p):
    for i in range(60):
        p.append(i)
        gevent.sleep(1)

products = []
gevent.spawn(produce, products)

要调试它,只需在控制台输入

$ python -m gtools.pdb app.py

然后按 'n' 直到到达task.join()行。此时,greenlet已经在后台开始工作。为了确保这一点,请在pdb控制台中多次输入products,您将看到由正在运行的greenlet填充的产品列表

> /app.py(9)<module>()
-> gevent.spawn(produce, products)
(Pdb) products
[0, 1, 2]
(Pdb) products
[0, 1, 2, 3, 4, 5, 6, 7]

使用gtools.pdb.set_trace()就像使用标准的pdb.set_trace()一样

监控greenlets

gtools.tree.Tree()允许您跟踪当前greenlets并以树形结构显示它们

>>> import gevent
>>> import gtools.tree

>>> def iloop():
...     gevent.sleep(1)

>>> def oloop():
...     gtools.spawn(iloop)
...     gevent.sleep(0.5)

>>> task = gtools.spawn(oloop)

>>> # sleep just to trigger spawn of inner greenlets
>>> gevent.sleep()
>>> tree = gtools.tree.Tree()

>>> # initial status
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Greenlet B: oloop> status=running
        └─ <Greenlet C: iloop> status=running

>>> # after outer loop finishes
>>> gevent.sleep(0.6)
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Greenlet B: oloop> status=finished:success
        └─ <Greenlet C: iloop> status=running

>>> # after inner loop finishes
>>> gevent.sleep(0.6)
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Greenlet B: oloop> status=finished:success
        └─ <Greenlet C: iloop> status=dead:garbage collected

>>> del task

>>> # when there are no more references to the greenlets
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Greenlet B: oloop> status=dead:garbage collected
        └─ <Greenlet C: iloop> status=dead:garbage collected

>>>
>>> # new tree
>>> print(gtools.tree.Tree())
Root

上述示例需要使用gtools.Greenlet

要从现有的gevent应用程序跟踪greenlets,您只需在导入您的应用程序之前猴子补丁gevent本身即可

# ======
# app.py
# ======

import gevent

def iloop():
    gevent.sleep(1)

def oloop():
    gevent.spawn(iloop)
    gevent.sleep(0.5)

def run():
    return gevent.spawn(oloop)
>>> from gtools.monkey import patch_gevent
>>> patch_gevent()
>>> import app
>>> import gtools.tree

>>> the_app = app.run()

>>> # sleep just to trigger spawn of inner greenlets
>>> gevent.sleep()
>>> tree = gtools.tree.Tree()

>>> # initial status
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Greenlet B: oloop> status=running
        └─ <Greenlet C: iloop> status=running

如果您没有猴子补丁,您仍然可以有限地了解正在运行的greenlets(注意,树状结构已丢失)

>>> import app
>>> import gtools.tree
>>> task = gevent.spawn(oloop)

>>> the_app = app.run()

>>> # sleep just to trigger spawn of inner greenlets
>>> gevent.sleep()
>>> tree = gtools.tree.Tree(all=True)

>>> # initial status
>>> print(tree)
Root
└─ <greenlet.greenlet A> status=running
    └─ <Hub [...]> status=running
        ├─ <Greenlet B: oloop> status=running
        └─ <Greenlet C: iloop> status=running

它甚至可以追踪跨多个线程的greenlets(见 examples/tree_threads.py

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

gevent-tools-0.3.1.tar.gz (7.7 kB 查看哈希值)

上传时间

由以下支持