A zc.monitor插件,用于测试函数是否挂起
项目描述
A zc.monitor插件,用于测试函数是否挂起
有时,计算会停止,很难找出原因。strace等工具可能会有所帮助,但它们非常低级。如果调用外部网络服务时挂起,您可能只能看到select或poll调用,而无法看到被调用的服务。
Isithanging提供了一个简单的注册表和辅助函数,用于注册和注销调用。为了说明这一点,我们将使用一个测试函数,该函数会阻塞,直到我们通过设置事件来取消阻塞它
>>> import zc.isithanging.tests >>> event, blocker = zc.isithanging.tests.create_blocker()
阻塞函数仅返回它接收到的任何参数。
为了检查函数是否阻塞,我们使用zc.isinhanging.run来运行该函数。我们将在一个线程中这样做
>>> import zc.thread >>> @zc.thread.Thread ... def thread(): ... print zc.isithanging.run(blocker, 1, foo=2)
还有一个装饰器可以包装一个函数并处理调用run。
让我们创建更多任务
>>> e1, b1 = zc.isithanging.tests.create_blocker() >>> suspect = zc.isithanging.suspect(b1) >>> @zc.thread.Thread ... def t1(): ... print suspect(1)
在上面的代码中,我们使用suspect装饰器作为函数(而不是使用装饰器语法)。
>>> e2, b2 = zc.isithanging.tests.create_blocker() >>> @zc.thread.Thread ... def t2(): ... print zc.isithanging.run(b2, 2)
我们可以通过查看zc.isithanging.running来查看正在运行的内容
>>> now = time.time() >>> for r in zc.isithanging.running: ... print r.show(now) Sun Nov 16 09:48:29 2014 1s <function f at 0x10251e500> (1,) {'foo': 2} Sun Nov 16 09:48:29 2014 1s <function f at 0x10251e9b0> (1,) {} Sun Nov 16 09:48:29 2014 1s <function f at 0x10251eb18> (2,) {}
show函数显示启动时间、已用秒数、函数和参数。
当任务停止时,它会自动注销
>>> e1.set(); t1.join() ((1,), {})>>> for r in zc.isithanging.running: ... print r Sun Nov 16 09:48:29 2014 2s <function f at 0x102d1e500> (1,) {'foo': 2} Sun Nov 16 09:48:29 2014 2s <function f at 0x102d1eb18> (2,) {}
有一个zc.monitor命令可以打印任务
>>> import sys >>> zc.isithanging.isithanging(sys.stdout) Sun Nov 16 09:48:29 2014 2s <function f at 0x102d1e500> (1,) {'foo': 2} Sun Nov 16 09:48:29 2014 2s <function f at 0x102d1eb18> (2,) {}
让我们完成任务并再次尝试
>>> event.set(); thread.join() ((1,), {'foo': 2}) >>> e2.set(); t2.join() ((2,), {})>>> zc.isithanging.isithanging(sys.stdout)
更改
0.3.0 (2014-11-17)
添加了“suspect”装饰器来装饰可能挂起的函数。
0.2.0 (2014-11-17)
(意外重新发布0.1。)
0.1.0 (2014-11-17)
初始发布