Потрясающий WM - os.execute vs afwul.spawn - PullRequest
0 голосов
/ 03 октября 2018

Мне было интересно, есть ли какая-нибудь разница между

os.execute('<command>')

Луи и

awful.spawn('<command>')

Awesome? Я заметил, что lain предлагает использовать os.execute,есть ли причина для этого, или это вопрос личного вкуса?

1 Ответ

0 голосов
/ 04 октября 2018

Никогда не используйте os.execute или io.popen.Они блокируют функции и вызывают очень плохую производительность и заметное увеличение ввода (мышь / клавиатура) и задержку перерисовки клиента.Использование этих функций является анти-паттерном и только сделает все хуже.

См. Предупреждение в документации https://awesomewm.org/apidoc/libraries/awful.spawn.html

Теперь, чтобы действительно ответить на вопрос, вы должны понимать, что Awesomeоднопоточный.Это означает, что он делает только одну вещь за один раз.Если вы наберете os.execute("sleep 10"), ваша мышь будет продолжать двигаться, но ваш компьютер будет зависать на 10 секунд.Для команд, которые выполняются достаточно быстро, может быть в состоянии пропустить это, но имейте в виду, что из-за правил задержки / частоты любая команда, для выполнения которой требуется 33 миллисекунды, упадет до 2 кадров в60fps видеоигра (и будет по крайней мере выпадет один).Если у вас много команд в секунду, они повышают производительность вашей системы.

Но Awesome не обречен быть медленным.Он может не иметь нескольких потоков, но он имеет нечто, называемое сопрограммой, а также имеет обратные вызовы.Это означает, что вещи, которые требуют времени для выполнения, могут все еще делать это в фоновом режиме (используя потоки C или внешний процесс + сокеты).Когда они закончили, они могут уведомить Потрясающую ветку.Это работает отлично и избегайте блокировки Awesome.

Теперь это подводит нас к следующей части.Если я это сделаю:

-- Do **NOT** do this.
os.execute("sleep 1; echo foo > /tmp/foo.txt")
mylabel.text = io.popen("cat /tmp/foo.txt"):read("*all*")

Метка будет отображаться foo.Но если я сделаю:

-- Assumes /tmp/foo.txt does not exist
awful.spawn.with_shell("sleep 1; echo foo > /tmp/foo.txt")
mylabel.text = io.popen("cat /tmp/foo.txt"):read("*all*")

, тогда ярлык будет пустым.awful.spawn и awful.spawn.with_shell будут , а не блоком, и, таким образом, io.popen будет выполнен wayyy до завершения sleep 1.Вот почему у нас есть асинхронные функции для выполнения команд оболочки.Существует много вариантов с отличительными характеристиками и сложностью.awful.spawn.easy_async является наиболее распространенным, поскольку он достаточно хорош для общего «Я хочу выполнить команду и сделать что-то с выводом, когда он завершится».

awful.spawn.easy_async_with_shell("sleep 1; echo foo > /tmp/foo.txt", function()
    awful.spawn.easy_async_with_shell("cat /tmp/foo.txt", function(out)
        mylabel.text = out
    end)
end)

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

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

...