Python Stackless и мультиядра?

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

24
задан Mike Pennington 24 November 2011 в 15:35
поделиться

1 ответ

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

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

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

причина, почему у Stackless нет многоядерной поддержки, состоит в том, потому что это делает потоки намного легче. И это, о чем stackless - все:

от официального stackless веб-сайта

Stackless Python является расширенной версией языка программирования Python. Это позволяет программистам получать выгоду основанного на потоке программирования без производительности и проблем сложности, связанных со стандартными потоками. Микропотоки, которые Stackless добавляет к Python, являются дешевым и легким удобством, которое может, если используется правильно, приносить следующую пользу:

  • Улучшенная структура программы.
  • [еще 117] читаемый код.
  • Повысил производительность программиста.

Вот ссылка еще к некоторой информации о нескольких ядрах и stackless.

40
ответ дан Arkady 28 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

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