Использование браузера профиля памяти Heapy с Twisted.web

Повторно используемый

Синхронизируемое использование блоков повторно используемый блокировки, что означает, содержит ли поток уже блокировку, он может re-aquire это без проблем. Поэтому Ваш код будет работать, как Вы ожидаете.

Посмотрите нижнюю часть страница Java Tutorial Внутренние Блокировки и Синхронизация .

Для заключения в кавычки с 2015-01†¦

Повторно используемая Синхронизация

Отзыв, что поток не может получить блокировку, принадлежавшую другому потоку. Но поток может получить блокировку, которой он уже владеет. Разрешение потока получить ту же блокировку несколько раз включает повторно используемая синхронизация . Это описывает ситуацию, где синхронизируемый код, прямо или косвенно, вызывает метод, который также содержит синхронизируемый код, и оба набора кода используют ту же блокировку. Без повторно используемой синхронизации синхронизируемый код должен был бы принять много дополнительных мер предосторожности, чтобы не иметь саму причину потока для блокирования.

8
задан Community 23 May 2017 в 11:45
поделиться

1 ответ

После просмотра веб-сайта гуппи и не найдя никакой информации о том, как запустить там браузер профиля, я начал поискать исходники гуппи и в конце концов нашел guppy / heapy / Prof.py в папке конец которого я увидел строку документации, содержащую эту строку:

[0] heapy_Use.html#heapykinds.Use.pb

Затем, вспомнив, что я видел некоторую документацию, указывающую тип возвращаемого значения guppy.hpy как Use, я проверил, подойдет ли guppy.hpy (). pb () что-нибудь. И действительно, это так. Похоже, так запускается браузер профилировщика. Я не уверен, что вы спрашивали об этом, но мне нужно было разобраться, прежде чем я смогу ответить на другую возможную часть вашего вопроса. :)

Кажется, самый простой способ сделать эту информацию доступной - создать на вашем веб-сервере ресурс, который вызывает Use.pb как часть своего процесса визуализации. Есть и другие подходы, такие как встраивание люка в ваше приложение или использование обработчика сигнала для его запуска, но мне нравится идея ресурса. Так, например:

class ProfileBrowser(Resource):
    def render_GET(self, request):
        h.pb()
        return "You saw it, right?"

...
root = RootResource(mq)
root.putChild("profile-browser", ProfileBrowser())
...

Затем вы можете посетить / profile-browser, когда захотите посмотреть в браузере профиля. Вызов «pb» блокируется до тех пор, пока браузер профиля не будет закрыт (обратите внимание, простое закрытие окна с помощью кнопки уничтожения wm, похоже, не вызывает его возврата - кажется, только пункт меню выхода), поэтому ваш сервер зависает, пока вы не закроете окно, но для целей отладки кажется, что это может быть нормально.

6
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: