Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (4)

Лучшие ответы пользователя

Все ответы (9)
  • Как понимать асинхронность в Tornado?

    @ykalchevskiy
    tornado.gen.coroutine + yield != асинхронность. Вызовы, которые делаются должны уметь работать асинхронно. Смотрим здесь первый пример:
    class AsyncHandler(RequestHandler):
        @asynchronous
        def get(self):
            http_client = AsyncHTTPClient()
            http_client.fetch("http://example.com",
                              callback=self.on_fetch)
    
        def on_fetch(self, response):
            do_something_with_response(response)
            self.render("template.html")

    Метод fetch объекта класса AsyncHTTPClient -- асинхронный. На это указывает аргумент callback (и название класса, конечно :)). Когда страница будет получена, вызовется _on_fetch. Как и в AJAX.
    Пример ниже на этой же странице -- это переписанная версия того же самого, просто красивее, без лапши коллбеков. Для этого и нужна пара tornado.gen.coroutine + yield.

    Вызов time.sleep(2) блокирует весь ioloop, вместо него можно воспользоваться чем-то типа
    yield tornado.gen.Task(tornado.ioloop.IOLoop.current().add_timeout, time.time() + 2)


    Но даже заменив эту строку, асинхронности не будет заметна. Это связано с ограничениями браузеров: они не умеют одновременно открывать одну и туже вкладку. Поэтому нужно открыть вкладки в разных браузерах.

    Еще одно: декоратор @tornado.web.asynchronous не нужен при использовании @tornado.gen.coroutine.

    Вот эту страничку нужно обязательно прочитать.
    Ответ написан
    Комментировать
  • Как происходит импортирование в Python?

    @ykalchevskiy
    Я не очень понимаю первый вопрос, поэтому на него ответить не могу. А вот почитать про подробности можно тут: asvetlov.blogspot.ru/2010/05/blog-post.html и следующие части.

    Upd (вопрос уточнен в комментарии):
    >>> import sys
    >>> import small
    >>> sys.getrefcount(small) - 1
    2
    >>> del small
    >>> sys.getrefcount(sys.modules['small']) - 1
    1

    При первой загрузке модуль попадает в словарь sys.modules, после этого используется уже эта загруженная версия. del small не удаляет модуль, а только уменьшает количество ссылок на него.
    Ответ написан
    2 комментария