0

В Clojure можно построить трубопроводы с участием шагов (s), некоторые дорогие (S), в многостадийного процесса связаны друг с другом синхронно (->) или асинхронно (~>) с помощью comp или chan соответственно. Я пытаюсь понять, какие каналы гранулярности необходимы, чтобы избежать блокировки и повышения производительности.Clojure: сколько асинхронности необходимо в конвейере процесса?

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

~> s ~> s ~> S ~> s 

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

~> s -> s -> S -> s 

Я думаю, что это то же самое, как:

~> S 

бы один предпочитает более меньшее количество каналов? Зачем?

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

ответ

1

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

Не имеет значения, насколько дороги индивидуальные шаги. Нет смысла в детализации, при которой предпочтительнее выбирать повторный факторинг в процессы, синхронизированные по каналам.

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

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

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

Смежные вопросы