3

我目前正在使用 fuse-python 编写保险丝。它已经在做它应该做的。然而,在它安装了几个星期后,它变得明显变慢了。所以我想分析它。我知道一些可以优化的地方。但这些不应该是罪魁祸首。

但是,fuse-python 会陷入无限循环(参见fuse source 的第 733 和 757 行)。如果我在调试模式下运行保险丝(使用-d开关),它将在前台运行。但是,我不能用SIGINT也不用CTRL+C(无论如何都是一样的)来阻止它。

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

这会对剖析产生影响。由于该过程永远不会正常终止,因此cProfile永远没有机会保存统计文件。

有任何想法吗?

4

1 回答 1

8

Python安装了一个KeyboardInterruptSIGINT. 如果在调用 fuse 的 main 时检测到非默认信号处理程序,它不会用自己的处理程序替换处理程序,它通常会调用fuse_session_exit清理. 在你调用了 fuse 的 main 之后,KeyboardInterrupt它被CFUNCTYPE包装器吞噬了,你再也看不到它们了。

您的选择是:

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

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

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

当您能够在不使用未捕获信号的情况下终止 FUSE 实例时,Python 分析器将能够正常保存统计信息。

于 2011-02-18T17:46:20.390 回答