Асинхронный вызов всегда создает/называет новый поток?

product_size = product_size.span.text[0] выведет символ в 1-й позиции строки, следовательно, вы получаете 3, 3, 3, 3, 3, 4 вместо 35, 36, 37, 38, 39, 40

Нет необходимости выполнять цикл for. Если вам нужен 2-й элемент из product_sizes.find_all('li'), вам просто нужно вызвать эту позицию с помощью product_sizes.find_all('li')[1]

. Вы можете сделать это в меньшем количестве строк кода, как показано ниже, но просто для демонстрации логики. .

#Get all elements in view_product dl, id='dl_1'
product_sizes = view_product.find('dl', id='dl_1')

# From product_sizes, find all the 'li' tags and choose the 2nd element
product_size = product_sizes.find_all('li')[1]

# Get the text
product_size = product_size.span.text

# print the text
print(product_size)
31
задан informatik01 26 October 2013 в 07:22
поделиться

6 ответов

Это - интересный вопрос.

Асинхронное программирование является парадигмой программирования, которое является преимущественно единственным, распараллелил, т.е. "после одного потока непрерывного выполнения".

Вы обращаетесь к JavaScript, поэтому позволяет, обсуждают тот язык, в среде веб-браузера. Веб-браузер выполняет единственный поток выполнения JavaScript в каждом окне, это обрабатывает события (такие как onclick = "someFunction ()") и сетевые соединения (такие как вызовы xmlhttprequest).

<script>
function performRequest() {
  xmlhttp.open("GET", "someurl", true);
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      alert(xmlhttp.responseText);
    }
  }
  xmlhttp.send(sometext);
}
</script>
<span onclick="performRequest()">perform request</span>

(Это - нерабочий пример для демонстрации только понятий).

, Чтобы сделать все асинхронным способом, поток управления имеет то, что известно как 'основной цикл'. Основной цикл отчасти походит на это:

while (true) {
    event = nextEvent(all_event_sources);
    handler = findEventHandler(event);
    handler(event);
}

важно отметить, что это не 'занятый цикл'. Это отчасти похоже на поток сна, ожидающий действия для появления. Действие могло быть введено от пользователя (Движение мыши, Нажатие кнопки, Введя), или это могла быть сетевая активность (Ответ с сервера).

Так в примере выше,

  1. , Когда пользователь нажимает на промежуток, событие ButtonClicked было бы сгенерировано, findEventHandler () найдет onclick событие на теге span, и затем что обработчик назвали бы с событием.
  2. , Когда запрос xmlhttp создается, он добавляется к all_event_sources списку источников события.
  3. После performRequest () функциональные возвраты, mainloop ожидает в nextEvent () шаг, ожидающий ответа. В этой точке нет ничего 'блокирующего' дальнейшие события от того, чтобы быть обработанным.
  4. данные возвращаются из удаленного сервера, nextEvent () возвращает сетевое событие, обработчик событий, как находят, является onreadystatechange () метод, тот метод называют, и предупреждение (), диалоговое окно разжигает.

стоит отметить, что предупреждение () является блокирующимся диалоговым окном. В то время как то диалоговое окно произошло, никакие дальнейшие события не могут быть обработаны. Это - эксцентриситет модели JavaScript веб-страниц, что у нас есть легко доступный метод, который заблокирует дальнейшее выполнение в контексте той страницы.

52
ответ дан 27 November 2019 в 21:44
поделиться

Модель Javascript однопоточная . Асинхронный вызов не новый поток, а скорее прерывает существующий поток. Это походит на прерывания в ядре.

Да имеет смысл иметь асинхронные вызовы с единственным потоком. Вот то, как думать об этом: Когда Вы вызываете функцию в единственном потоке, состояние для существующего метода продвинуто на стек (т.е. локальные переменные). Подпрограмма вызывается и в конечном счете возвращается, в котором времени исходное состояние выталкивается от стека.

С асинхронным обратным вызовом, то же самое происходит! Различие - то, что подпрограмма вызывается системой, не текущим кодом, вызывающим подпрограмму.

16
ответ дан 27 November 2019 в 21:44
поделиться

Пара примечаний о JavaScript в особенности:

XMLHttpRequest с не блокируются по умолчанию. send() метод сразу возвращается после того, как запрос был передан к стопке базовой сети. Ответ с сервера запланирует вызов Вашего обратного вызова на цикле событий, как обсуждено другими превосходными ответами.

Это не требует нового потока. Базовый API сокета можно выбрать, подобен java.nio.channels в Java.

возможно создать синхронный XMLHttpRequest объекты путем передачи false как третий параметр к open() . Это заставит send() метод блокироваться, пока ответ не был получен от сервера, таким образом поместив цикл событий во власти сетевой задержки и потенциально подвесив браузер до сетевого тайм-аута. Это - Плохой Thingв „ў.

Firefox 3.5 начнет кристально честный многопоточный JavaScript с Worker класс. Фоновый код работает в абсолютно отдельной среде и общается с окном браузера путем планирования обратных вызовов на цикл событий.

6
ответ дан 27 November 2019 в 21:44
поделиться

Во многих приложениях GUI асинхронный вызов (как invokeLater Java) просто добавляет Выполнимый объект к своей очереди потока GUI. Поток GUI уже создается, и он не создает новый поток. Но потоки даже строго не требуются для асинхронной системы. Возьмите, например, libevent, который использует select/poll/kqueue, и т.д. для совершения неблокирующихся вызовов к сокетам, который тогда запускает обратные вызовы в код, полностью без потоков.

4
ответ дан 27 November 2019 в 21:44
поделиться

Я не знаю о JavaScript, но например в мире Windows Forms, асинхронные вызовы могут быть сделаны без нескольких потоков. Это имеет отношение к способу, которым работает сообщение Windows Насос. В основном приложение Windows Forms настраивает очередь сообщений, через которую Windows помещает сообщения, уведомляющие его о событиях. Например, при перемещении мыши сообщения будут помещены в ту очередь. Приложение Windows Forms будет в бесконечном цикле, использующем все сообщения, которые брошены в него. Согласно то, что каждое сообщение содержит его, переместит окна, перекрасит их или даже вызовет пользовательские методы среди других вещей. Вызовы к методам определяются делегатами. Когда приложение находит экземпляр делегата в очереди, оно счастливо вызывает метод, отнесенный делегатом.

Так, если Вы находитесь в методе, делающем что-то, и хотите породить некоторую асинхронную работу, не создавая новый поток, все, которое необходимо сделать, поместить экземпляр делегата в очередь, с помощью Управления. Метод BeginInvoke. Теперь, это не является на самом деле многопоточным, но если Вы бросите очень маленькие обрабатываемые детали в очередь, то она будет похожа многопоточный. Если, с другой стороны, Вы дадите ему трудоемкий метод для выполнения, то приложение заморозится, пока метод не сделан, который будет похож на создавшее затор приложение, даже при том, что это делает что-то.

2
ответ дан 27 November 2019 в 21:44
поделиться

Нет, но больше чем один поток будет включен.

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

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

Так, таким образом: больше чем один поток будет включен, но он не обязательно создает новый поток.

2
ответ дан 27 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

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