2017-06-08 4 views

答えて

1

それはあなたが明示を要求していないタスクを実行するようfirebaseモジュールは悪いプログラマによって書かれたこと。その理由から、誰かがそのモジュールを使用することを明確に指示するようアドバイスします。なぜなら、他のどのようなブービートラップがコード内にあるのか分からないからです。確かに、彼らはおそらくこの行動が便利だと思うかもしれませんが、利便性はプログラマーの期待を破るだけですが(これはモジュールの作者のすべてが絶対に従わなければならない1つのルールです)、この質問は便利であれば存在しません。彼らはそれがマルチプロセッシングに大きく依存していることを言うのですが、彼らはあなたがそれで発言権を持っていません言及していない:

非同期呼び出しを作成する際、同時実行が入ってくるときのインターフェイスが重くスタンダールマルチプロセッシング・ライブラリに依存

。オンデマンドプロセスプールが作成され、非同期メソッドがプール内のアイドルプロセスの1つによって実行されます。プールは、メインプロセスが終了するまで生き残ります。したがって、非同期呼び出しをトリガーするたびに、常に同じプールを使用します。メソッドが戻ると、プールプロセスは返された値を、提供されたコールバック関数内のメインプロセスに戻します。

したがって、すべてのことが言われ...、そのモジュールのメイン__init__.py 5つの固定スロットと順番に(その_process_poolに設定)multiprocessing.Poolを作成し、そのasync.pyモジュールをインポートし、そしてに何も与えないので、これが起こりますmainスクリプトの5つの追加プロセスを取得するので、resultを6回(メインプロセスと生成された5つのサブプロセス)出力します。

最終行 - このモジュールは使用しないでください。他にも選択肢はありますが、あなたが絶対に持っている場合 - メインプロセスチェックを使用してコードを守る:

if __name__ == "__main__": 
    print("result") 

それはまだ5つのサブプロセスを起動し、終了するためにそれらのすべてを待ちます(かなり速いです)が、少なくともあなたの保護されたコードは実行されません。

+0

async.pyファイルの値が5から0に変更されました。実行後も出力は6回与えられます。助けてください –

+0

'multiprocessing.Pool'の最小作業人数が' 1'であると不平を言うので、あなたは正しいファイルを変更していません。これを止める唯一の方法は、上記のようなガードを使用することです - はい、それは依然として不要なプロセスを生成しますが、少なくとも何も実行しません(潜在的にモジュールの愚かな動作を変更し、モジュールの動作を変更しないで、モジュールを変更してください!代わりに['pyfirebase'](https://github.com/afropolymath/pyfirebase)を試してください。たとえば、 – zwer

+0

私たちはPyfirebaseを試しました。しかし、FirebaseApplicationを使いたいのであれば、pyfirebaseモジュールからどのように使うことができますか? –

関連する問題