Почему многопоточность так мало используется?



В основном потому:

    Многопоточность неприменима для большинства проблем (см. причину №3).
    Для значительного подмножества проблем, для которых применима многопоточность, выгоды от ее использования не настолько значительны, чтобы стоить дополнительных усилий по разработке.
    Для подмножества оставшихся сценариев использования многопоточность требует переосмысления способа решения проблемы, чтобы разбить ее на отдельные фрагменты, которые могут обрабатываться разными потоками, а результаты затем объединяться.


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

    Это требует той же работы по перепроектированию, о которой я говорил в #3 выше, но это происходит на более высоком логическом и системном уровне, чем многопоточность. Вместо нескольких потоков, работающих в одном процессе и общающихся друг с другом, вы получаете несколько процессов, которые, скорее всего, работают на разных экземплярах сервера (обычно на docker, иногда на виртуальных серверах), возможно, на разном серверном оборудовании, общающихся друг с другом по сети.

Многопоточность обычно полезна для решения двух типов задач:

  • Задачи, которые легко разделить на части и передать нескольким потокам или процессам, а затем вернуть результаты и объединить их. Это также называется “highly parallelizable”.

    Конечно, многие 3D-рендеринг является высоко параллелизуемым… и почти все компьютеры имеют специализированное оборудование GPU для выполнения этой задачи намного быстрее, чем это может сделать любой CPU.
  • Проблемы, часть которых сильно связана с вводом-выводом, наиболее распространенный пример - пользовательские интерфейсы, которые тратят большую часть своего времени на ожидание скорости реакции человека.

    На самом деле, многопоточность часто используется в пользовательских интерфейсах, а также в веб-серверах, которые сталкиваются с той же проблемой.
  • 662   0  

    Comments

      Ничего не найдено.