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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 162a6af50931aa07b27da6c831ce362d5668d7a7f8426ccd25255d23fd4638ad |
|
MD5 | f0b4e935a9cebe91e76876ec20f7e41e |
|
BLAKE2b-256 | 746d7b281a381d65fa7e73d50e1cec3dbde744f3d477cc436b762600277a203e |