1

http://eventlet.net/doc/patching.htmのドキュメントに は、「引数が指定されていない場合、すべてにパッチが適用されます」と記載されています。および「スレッド、スレッド、およびキューにパッチを適用するスレッド」。

しかし、簡単なテストでは:

#!/bin/env python

import threading

import eventlet
eventlet.monkey_patch()

if __name__ == '__main__':
    patched = eventlet.patcher.is_monkey_patched(threading)
    print('patched : %s' % patched)

結果は次のとおりです。

patched : False

スレッドにはまったくパッチが適用されていないようです。ドキュメントが間違っていますか?

4

1 に答える 1

1

ドキュメントが正しいことがわかりました。問題は is_monkey_patched() に関するもので、'threading, Queue' モジュールなどの状況を検出できません。この関数の src を見てください。動作は簡単に理解できます。

def _green_thread_modules():
    from eventlet.green import Queue
    from eventlet.green import thread
    from eventlet.green import threading
    if six.PY2:
        return [('Queue', Queue), ('thread', thread), ('threading', threading)]
    if six.PY3:
        return [('queue', Queue), ('_thread', thread), ('threading', threading)]

    if on['thread'] and not already_patched.get('thread'):
        modules_to_patch += _green_thread_modules()
        already_patched['thread'] = True

def is_monkey_patched(module):
    """Returns True if the given module is monkeypatched currently, False if
    not.  *module* can be either the module itself or its name.

    Based entirely off the name of the module, so if you import a
    module some other way than with the import keyword (including
    import_patched), this might not be correct about that particular
    module."""
    return module in already_patched or \
        getattr(module, '__name__', None) in already_patched

また、パッチ操作は次のように実装されているためです。

    for name, mod in modules_to_patch:
        orig_mod = sys.modules.get(name)
        if orig_mod is None:
            orig_mod = __import__(name)
        for attr_name in mod.__patched__:
            patched_attr = getattr(mod, attr_name, None)
            if patched_attr is not None:
                setattr(orig_mod, attr_name, patched_attr)

以下を使用して、threading/Queue などのモジュールにパッチが適用されているかどうかを確認できます。

 >>>import threading
 >>>eventlet.monkey_patch()
 >>>threading.current_thread.__module__
 >>>'eventlet.green.threading' 
于 2015-09-09T07:51:00.497 に答える