2016-09-16 6 views
1

На работе мы используем gevent для создания асинхронных серверов, и есть некоторые споры о том, когда нужно выполнять патч обезьяны по отношению к другим модулям. Документация gevent показывает такие вещи:gevent monkey patching order

from gevent import monkey 
monkey.patch_socket() 
import socket 

Там, где происходит перехват обезьян, прежде чем библиотеки будут импортированы.

Однако, мой менеджер чувствует порядок обезьяны заплат должен быть так:

import socket 
from gevent import monkey 
monkey.patch_socket() 

Где обезьяна латание вызывается после того, как модуль библиотеки импортируется. Это делает его похожим на патч обезьяны, который видит, что модуль сокета был импортирован и исправляет его в этот момент.

Я нашел несколько дискуссий, которые говорят об этом в одном направлении, и другие, которые говорят, чтобы сделать это другим. Мое собственное простое тестирование, похоже, говорит, что это неважно. Кто-нибудь имеет мнение по этому поводу, с некоторыми ясными причинами, почему, или ссылками, которые могли бы сказать, почему?

Спасибо заранее! Doug

ответ

0

Ну, в соответствии с исходным кодом (см ниже) patch_socket называет patch_module, который импортирует socket модуль для вас.

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 documentation, который специфический говорит (multiple times), что рекомендуемый способ обезьяны-патч, чтобы сделать это как можно раньше, и предпочтительно до других импорта.

Теперь с большинством стандартных библиотечных модулей вы можете уйти с патчем обезьяны после их импорта. Но сторонние библиотеки не обязательно безопасны таким образом. В целом, это просто безопаснее и уменьшает проблемы с обезьяной-патчем как можно скорее.

+0

Спасибо за «привкус вверх головой», я пару раз читал эту документацию и все еще путался из-за примеров, которые я видел в сети, которые делают это иначе. Должен был доверять документам. :) –

+0

Hi Jason, Просьба пояснить, что не так с (Python 3.5.2 on linux) ** от gevent.monkey import patch_all; is_module_patched; patch_all(); импорт; is_module_patched (socket) ** => _False_ – dvska

+1

'is_module_patched (modname)' принимает имя модуля *, а не сам модуль. –

 Смежные вопросы

  • Нет связанных вопросов^_^