Все событийно-ориентированные платформы должны быть однопоточными?

Вы можете использовать свойство css grid-template-areas:, чтобы указать, какие элементы должны появляться и где.

Пример использования вашего кода:

#diagram-times {grid-area: topleft}
.main-diagram-1 {grid-area: topright;}
.main-diagram-2 {grid-area: botleft;}
.main-diagram-3 {grid-area: botright;}

.container {
  display: grid;
  grid-template-columns: 100px 100px;
  grid-template-rows: auto;
  grid-template-areas: 
  "topleft topright"
  "botleft botright"
}

Отличное руководство по сетке.

10
задан Mark Harrison 12 September 2016 в 15:01
поделиться

6 ответов

Я бы сказал «нет» с оговоркой. Платформы, управляемые событиями, которые вращаются вокруг общего состояния, такие как пользовательский интерфейс, должны быть однопоточными. Механизмы, управляемые событиями, которые вращаются вокруг уведомлений, например, механический мониторинг (например, оповещение о слишком высоком давлении в трубе), может быть однопоточным, но может быть более подходящим для многопоточности.

Конечно, возможно создать многопоточный каркас пользовательского интерфейса, и я сделал это сам. В конце я преобразовал это, чтобы быть однопоточным. Частично причина подпадает под то, что Чарли сказал о «это слишком сложно». Проблема заключалась в том, что с многопоточной структурой пользовательского интерфейса не только я должен был иметь дело с потоками, но и любой, кто использовал пользовательский интерфейс. Ядро было, конечно, потокобезопасным, но тогда любой, кто написал элемент управления, должен был сделать этот поток также безопасным. Не забывайте, что при внесении нескольких изменений в пользовательский интерфейс вы должны были уведомить ядро ​​о том, что вы делаете, чтобы вы не получили частичные обновления. Поскольку пользователь обычно довольно медленный, любой выигрыш в производительности был незначительным, и его можно было бы обойти с помощью асинхронного вызова, если это необходимо для конкретных случаев. Однопоточность на самом деле является подходящей моделью.

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет большой смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

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

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет большой смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

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

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет большой смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

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

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет большой смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

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

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет большой смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет выдающийся смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

С другой стороны, в модели, где нет общего (или не очень) общего состояния, многопоточная модель имеет выдающийся смысл. Нет никаких причин для того, чтобы задерживать одно событие (реактор горит) на 30 секунд, которые требуются для истечения тайм-аута вашего запроса (оператор Боб только что отключился), потому что некоторые операции в оперативном режиме оставили таблицу punch_card заблокированной.

5
ответ дан 3 December 2019 в 20:43
поделиться

Нет. Даже по практическому правилу просто говорится: «Трудно заставить их работать». Но управляемые событиями фреймворки очень похожи на управляемые событиями симуляции и другие вещи; тот факт, что в Javaworld это сложно, не факт многопоточности, а об абстракциях, доступных в Java.

В другой среде, такой как Erlang, оба довольно естественны, довольно устойчивы.

Update

по-прежнему звучит так, будто у него неправильные абстракции. Я не вижу ничего, присущего проблеме, которая вызывает проблему блокировки. Ключ, я думаю, приходит сюда:

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

Так почему же тупик почти неизбежен? Потому что происходит два разных вида деятельности, которые хотят получить замки в противоположных порядках. И это потому, что «мы, естественно, будем делать блокировку отдельно в каждой абстракции».

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

  • « естественно мы будем делать блокировку отдельно в абстракциях» и
  • «у нас происходят события, которые хотят получить блокировки в противоположных порядках». 1244 По моему опыту, «естественно, Х» обычно означает «я действительно не искал других вариантов». И я очень сомневаюсь, что события хотят приобрести замки в противоположных порядках; вы получаете блокировку, вы делаете что-то и отпускаете ее.

    Дело в том, что он, кажется, представляет факт, что ему трудно придумать схему, которая выполняет работу как Теорема о том, что никакая схема не может работать.

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

7
ответ дан 3 December 2019 в 20:43
поделиться

Мне интересно, насколько большая проблема связана с тем, что многопоточность не подходит для обработки событий, и насколько много, что многие разработчики, которые создают GUI, не владеют многопоточностью.

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

3
ответ дан 3 December 2019 в 20:43
поделиться

Да и нет.

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

Однако ни в одном определении нет управляемой событиями среды, которая не может отправлять события в несколько потоков.

1
ответ дан 3 December 2019 в 20:43
поделиться

Это практическое правило вообще не применяется к фреймворкам без GUI. См. Уэльскую архитектуру SEDA, см. Yield (code.google.com/p/yield) для хорошей гибридной реализации на python / c ++.

1
ответ дан 3 December 2019 в 20:43
поделиться

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

Это это то, как управляемые событиями рамки были традиционно определены. Вот хорошее описание того, как процессы Erlang связаны с циклом событий виртуальной машины:

Процессы Erlang тесно интегрированы с управляемым событиями ядром сетевого ввода-вывода Erlang VM. Процессы могут «владеть» сокетами и отправлять и получать сообщения в / из сокетов. Это обеспечивает элегантность программирования, ориентированного на параллелизм, плюс масштабируемость ввода-вывода, управляемого событиями (виртуальная машина Erlang использует epoll / kqueue под прикрытиями).

http://yarivsblog.com/articles/2008/05/18/erlang -vs-scala /

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

http://home.pacbell.net/ouster/threads.pdf

1
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

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