2016-09-16 12 views
1

私たちはgeventを使っていくつかの非同期サーバーを作成しています。他のモジュールとの関係でmonkey patchingを実行するタイミングについてはいくつかの議論があります。 geentドキュメンテーションは次のようなものを示しています:gevent monkey patching order

from gevent import monkey 
monkey.patch_socket() 
import socket 

ライブラリモジュールをインポートする前にサルのパッチが当てられます。

しかし、私のマネージャーは、猿のパッチ適用の順序は、このする必要があります感じている:ライブラリモジュールをインポートした後、サルのパッチ適用が呼び出される

import socket 
from gevent import monkey 
monkey.patch_socket() 

。これは、サルのパッチがソケットモジュールがインポートされたことを確認し、その時点でパッチを当てるように見えます。

私は、それを一方向にすると言っている議論と、もう一方でそれを行うと言っている議論を見つけました。私自身の簡単なテストは問題ではないと言うようです。なぜ誰かがこれについての意見を持っているのですか。

ありがとうございます! Doug

答えて

0

まあ、ソースコード()によると、socketモジュールをインポートするpatch_moduleが呼び出されます。

def patch_module(name, items=None): 
    gevent_module = getattr(__import__('gevent.' + name), name) 
    module_name = getattr(gevent_module, '__target__', name) 
    module = __import__(module_name) 
    if items is None: 
     items = getattr(gevent_module, '__implements__', None) 
     if items is None: 
      raise AttributeError('%r does not have __implements__' % gevent_module) 
    for attr in items: 
     patch_item(module, attr, getattr(gevent_module, attr)) 
    return module 

これを参照するには、gevent GitHubのリポジトリを参照してください。

ソケットをインポートする必要はありません(もちろん使用しない限り)。

1

geventの現在のメンテナとして、私は特に言うthe documentationmultiple times)モンキー・パッチに推奨される方法は、早けれ可能であり、好ましくは前に、他の輸入としてそれをを行うことであることを指します。

ほとんどの標準ライブラリモジュールでは、インポート後に猿のパッチを手に入れることができます。しかし、第三者図書館は必ずしもそのように安全であるとは限りません。一般的に、それはちょうどより安全であり、サルパッチの問題を極力減らします。

+0

「頭を上げてください」というお礼をいただきありがとうございます。私はこのドキュメントを数回読んでいますが、それ以外の場合はネットで見た例のために混乱しました。ドキュメントを信頼する必要があります。 :) –

+0

こんにちはジェイソン、 何が間違っているかを明確にしてください (Linux上のPython 3.5.2) ** from gevent.monkey import patch_all; is_module_patched; patch_all();インポートソケット。 is_module_patched(ソケット)** => _False_ – dvska

+1

'is_module_patched(modname)'はモジュール* name *をモジュール自身ではなく取ります。 –