我目前正在使用fuse-python编写保险丝。它已经做了应有的事情。然而,在它安装几周后,它变得明显变慢。所以我想描述一下。我知道可以优化的几点。但这些不应该是罪魁祸首。
然而,fuse-python在无限循环中挂起(参见line 733 and 757 of the fuse source)。如果我在调试模式下运行fuse(使用-d
开关),它将在前台运行。但是,我无法使用SIGINT
或CTRL+C
(无论如何都是相同的)来阻止它。
我尝试使用signal
模块来捕获主线程中的信号。但这也不起作用。有趣的是,一旦我使用SIGKILL
向下搜索了该过程,我就会在KeyboardInterrupt
上看到stdout
。此外,在SIGKILL
之后,信号处理程序按预期执行。
这会对分析产生影响。由于进程永远不会正常终止,cProfile
永远不会有机会保存统计信息文件。
有什么想法吗?
答案 0 :(得分:8)
Python installs a handler that raises KeyboardInterrupt
on SIGINT
。如果在调用fuse的main时检测到非默认信号处理程序,它将not replace the handler with its own,通常调用fuse_session_exit
和cleans up。在您调用fuse的main之后,KeyboardInterrupt
被CFUNCTYPE
包装器吞没,您永远不会看到它们。
您的选择是:
SIGINT
以外的任何其他终止信号发送SIGQUIT
。但是保险丝不会干净地退出。SIGINT
,并在完成后恢复原始文件。
old_handler =signal(SIGINT, SIG_DFL)
# call main
signal(SIGINT, old_handler)
我强烈建议您切换到替代绑定,fuse-python非常混乱且难以使用。我和fusepy有很多运气,并在那里提交了一些补丁。
如果您能够在不使用未捕获信号的情况下终止FUSE实例,则Python探查器将能够按正常方式保存统计信息。