2011-02-18 13 views
3

現在、私はfuse-pythonを使ってヒューズを書いています。それはすでに必要なことをやっている。しかし、それが数週間マウントされた後、それは著しく遅くなってきています。だから私はそれをプロファイルしたかった。私はそれが最適化できるいくつかの点について知っています。しかし、これらは犯人であってはならない。プロファイリングfuse-python

しかし、fuse-pythonは無限ループでハングします(line 733 and 757 of the fuse source参照)。ヒューズをデバッグモード(-dスイッチを使用)で実行すると、フォアグラウンドで実行されます。しかし、私はSIGINTでもCTRL+Cでも(それはとにかく同じです)それを止めることはできません。

signalモジュールを使用して、メインスレッドの信号をトラップしました。しかし、これはどちらもうまくいかない。興味深いことに、プロセスをSIGKILLで実行すると、KeyboardInterruptstdoutに表示されます。また、SIGKILLの後に、シグナルハンドラが期待通りに実行されます。

これはプロファイリングに影響を与えます。プロセスが正常に終了しないので、cProfileは統計ファイルを保存する機会を得ることはありません。

アイデア?

+0

@matt:私はまだそれに取り組む機会がありませんでした。私は簡単にあなたの答えを読んで、それは健全に見えます。私は確かに私が確認して確認した回答だけを受け入れるだろうと自分に言った。私は今後数週間で何ができるかを見ていきます。それは私の暇な時間に行う非常に低い優先度のプロジェクトなので、私はそれに取り組むのに多くの時間がありません。パフォーマンスとプロファイリングは、現在、私の心配の最後です。 – exhuma

答えて

8

Python installs a handler that raises KeyboardInterrupt on SIGINT。ヒューズのメインが呼び出されたときにデフォルト以外のシグナルハンドラが検出された場合はnot replace the handler with its ownとなり、通常はfuse_session_exitcleans upが呼び出されます。ヒューズのメインを呼び出した後、KeyboardInterruptCFUNCTYPEラッパーによって飲み込まれ、決してそれらを見ません。

あなたのオプションは以下のとおりです。

  • 、またはSIGINT以外の任意の他の終端信号\ はCtrl + を押してSIGQUITを送信します。ただし、ヒューズは正常に終了しません。
  • fuseのmainを呼び出す前に、デフォルトのシグナルハンドラをSIGINTにインストールし、完了したら元の状態に戻します。

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

は、私は非常にあなたにも結合代替への切り替えをお勧めしたい、ヒューズPythonはで動作するようにひどく厄介で困難です。私は fusepyとたくさんの運があり、そこにいくつかのパッチを提出しました。

キャッチされていないシグナルを使用せずにFUSEインスタンスを終了できる場合、Pythonプロファイラは統計を通常通り保存できます。

+0

'fusepy'に言及していただきありがとうございます。 'fuse-python'は本当にひどく乱雑です。私はコードをちょうど2回掘り下げようとしました。もう一度見ないでください;)私はコードを 'fusepy'を使って最初に変更します。それでは、もう一度プロファイリングを見てみましょう... – exhuma

+0

@exhuma:私は、重い使用の後に私自身のバインディングにfusepyを適応させました。最新のバージョンはhttp://code.google.com/p/cpfs/source/browse/python/fuse.pyで読むことができます。価値がある場合は、それを取り出して文書化し、スタンドアローンにしますそれのためのプロジェクト。 –

+0

変更履歴がありますか?変更の簡単な要約?私はそれをダウンロードし、私は時間を得ると 'diff'を行うでしょう。それにもかかわらず、迅速な変更ログが役に立ちます。 – exhuma

関連する問題