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)
Это - интересный вопрос.
Асинхронное программирование является парадигмой программирования, которое является преимущественно единственным, распараллелил, т.е. "после одного потока непрерывного выполнения".
Вы обращаетесь к 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);
}
важно отметить, что это не 'занятый цикл'. Это отчасти похоже на поток сна, ожидающий действия для появления. Действие могло быть введено от пользователя (Движение мыши, Нажатие кнопки, Введя), или это могла быть сетевая активность (Ответ с сервера).
Так в примере выше,
стоит отметить, что предупреждение () является блокирующимся диалоговым окном. В то время как то диалоговое окно произошло, никакие дальнейшие события не могут быть обработаны. Это - эксцентриситет модели JavaScript веб-страниц, что у нас есть легко доступный метод, который заблокирует дальнейшее выполнение в контексте той страницы.
Модель Javascript однопоточная . Асинхронный вызов не новый поток, а скорее прерывает существующий поток. Это походит на прерывания в ядре.
Да имеет смысл иметь асинхронные вызовы с единственным потоком. Вот то, как думать об этом: Когда Вы вызываете функцию в единственном потоке, состояние для существующего метода продвинуто на стек (т.е. локальные переменные). Подпрограмма вызывается и в конечном счете возвращается, в котором времени исходное состояние выталкивается от стека.
С асинхронным обратным вызовом, то же самое происходит! Различие - то, что подпрограмма вызывается системой, не текущим кодом, вызывающим подпрограмму.
Пара примечаний о JavaScript в особенности:
XMLHttpRequest
с не блокируются по умолчанию. send()
метод сразу возвращается после того, как запрос был передан к стопке базовой сети. Ответ с сервера запланирует вызов Вашего обратного вызова на цикле событий, как обсуждено другими превосходными ответами.
Это не требует нового потока. Базовый API сокета можно выбрать, подобен java.nio.channels
в Java.
возможно создать синхронный XMLHttpRequest
объекты путем передачи false
как третий параметр к open()
. Это заставит send()
метод блокироваться, пока ответ не был получен от сервера, таким образом поместив цикл событий во власти сетевой задержки и потенциально подвесив браузер до сетевого тайм-аута. Это - Плохой Thingв „ў.
Firefox 3.5 начнет кристально честный многопоточный JavaScript с Worker
класс. Фоновый код работает в абсолютно отдельной среде и общается с окном браузера путем планирования обратных вызовов на цикл событий.
Во многих приложениях GUI асинхронный вызов (как invokeLater Java) просто добавляет Выполнимый объект к своей очереди потока GUI. Поток GUI уже создается, и он не создает новый поток. Но потоки даже строго не требуются для асинхронной системы. Возьмите, например, libevent, который использует select/poll/kqueue, и т.д. для совершения неблокирующихся вызовов к сокетам, который тогда запускает обратные вызовы в код, полностью без потоков.
Я не знаю о JavaScript, но например в мире Windows Forms, асинхронные вызовы могут быть сделаны без нескольких потоков. Это имеет отношение к способу, которым работает сообщение Windows Насос. В основном приложение Windows Forms настраивает очередь сообщений, через которую Windows помещает сообщения, уведомляющие его о событиях. Например, при перемещении мыши сообщения будут помещены в ту очередь. Приложение Windows Forms будет в бесконечном цикле, использующем все сообщения, которые брошены в него. Согласно то, что каждое сообщение содержит его, переместит окна, перекрасит их или даже вызовет пользовательские методы среди других вещей. Вызовы к методам определяются делегатами. Когда приложение находит экземпляр делегата в очереди, оно счастливо вызывает метод, отнесенный делегатом.
Так, если Вы находитесь в методе, делающем что-то, и хотите породить некоторую асинхронную работу, не создавая новый поток, все, которое необходимо сделать, поместить экземпляр делегата в очередь, с помощью Управления. Метод BeginInvoke. Теперь, это не является на самом деле многопоточным, но если Вы бросите очень маленькие обрабатываемые детали в очередь, то она будет похожа многопоточный. Если, с другой стороны, Вы дадите ему трудоемкий метод для выполнения, то приложение заморозится, пока метод не сделан, который будет похож на создавшее затор приложение, даже при том, что это делает что-то.
Нет, но больше чем один поток будет включен.
асинхронный вызов мог бы запустить другой поток, чтобы сделать работу, или это могло бы добавить сообщение в очередь на другом, уже выполнив поток. Вызывающая сторона продолжает, и вызываемый перезванивает, как только это обрабатывает сообщение.
, Если бы Вы хотели сделать синхронный вызов в этом контексте, необходимо было бы добавить сообщение и активно ожидать обратного вызова для случая.
Так, таким образом: больше чем один поток будет включен, но он не обязательно создает новый поток.