剖析fuse-python

时间:2011-02-18 17:17:11

标签: python profiling signals fuse

我目前正在使用fuse-python编写保险丝。它已经做了应有的事情。然而,在它安装几周后,它变得明显变慢。所以我想描述一下。我知道可以优化的几点。但这些不应该是罪魁祸首。

然而,fuse-python在无限循环中挂起(参见line 733 and 757 of the fuse source)。如果我在调试模式下运行fuse(使用-d开关),它将在前台运行。但是,我无法使用SIGINTCTRL+C(无论如何都是相同的)来阻止它。

我尝试使用signal模块来捕获主线程中的信号。但这也不起作用。有趣的是,一旦我使用SIGKILL向下搜索了该过程,我就会在KeyboardInterrupt上看到stdout。此外,在SIGKILL之后,信号处理程序按预期执行。

这会对分析产生影响。由于进程永远不会正常终止,cProfile永远不会有机会保存统计信息文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

Python installs a handler that raises KeyboardInterrupt on SIGINT。如果在调用fuse的main时检测到非默认信号处理程序,它将not replace the handler with its own,通常调用fuse_session_exitcleans up。在您调用fuse的main之后,KeyboardInterruptCFUNCTYPE包装器吞没,您永远不会看到它们。

您的选择是:

  • Ctrl + \ SIGINT以外的任何其他终止信号发送SIGQUIT。但是保险丝不会干净地退出。
  • 在调用fuse的main之前,将默认信号处理程序安装到SIGINT,并在完成后恢复原始文件。

old_handler =signal(SIGINT, SIG_DFL)
# call main
signal(SIGINT, old_handler)

我强烈建议您切换到替代绑定,fuse-python非常混乱且难以使用。我和fusepy有很多运气,并在那里提交了一些补丁。

如果您能够在不使用未捕获信号的情况下终止FUSE实例,则Python探查器将能够按正常方式保存统计信息。