Предоставляет ли F # автоматическое parallelism?
Под этим я имел в виду: когда вы создадите свои побочные эффекты приложения и т.д., будет ли F # -код автоматически распределяться по всем ядрам?
Ответы
Ответ 1
Нет, я боюсь, что нет. Учитывая, что F # не является чисто функциональным языком (в строгом смысле), было бы довольно сложно сделать это, я верю. Основной способ использования parallelism в F # - использовать Async Workflows (в основном через модуль Async, который, как я полагаю). TPL (параллельная библиотека задач), которая внедряется с .NET 4.0, будет выполнять аналогичную роль в F # (хотя, в частности, ее можно использовать на всех языках .NET одинаково хорошо), хотя я не могу сказать, m точно, как он собирается интегрироваться с существующей инфраструктурой async. Возможно, Microsoft просто посоветует использовать TPL для всего, или, может быть, они оставят оба в качестве опции, а в конечном итоге станут стандартом де-факто...
В любом случае, вот несколько статей по асинхронному программированию/рабочим процессам в F #, чтобы вы начали.
Ответ 2
F # не делает его автоматическим, это просто упрощает.
Еще один шанс связать с обсуждение Luca PDC. Восемь минут, начиная с 52:20, представляют собой потрясающую демонстрацию рабочих процессов F # async. Это скалы!
Ответ 3
Нет, я уверен, что он автоматически не будет автоматически распараллеливаться. Это должно было бы знать, что ваш код был свободным от побочных эффектов, что может быть трудно доказать, во-первых.
Конечно, F # может облегчить параллелизацию вашего кода, особенно если у вас нет побочных эффектов... но это другое дело.
Ответ 4
Как и многие другие, F # не будет автоматически масштабировать по ядрам и по-прежнему будет нуждаться в инфраструктуре, такой как порт ParallelFX, о котором говорил Джош.
F # обычно ассоциируется с возможностью параллельной обработки, поскольку по умолчанию он неизменен для объектов, устраняя необходимость блокировки для многих сценариев.
Ответ 5
В аннотациях чистоты: Контракты кода имеют атрибут Pure. Я помню, что некоторые части BCL уже используют это. Потенциально, этот атрибут может быть использован и в рамках параллелизма, но я не знаю о такой работе на данный момент. Кроме того, я даже не знаю, насколько хорошо контакты кода можно использовать из F #, поэтому здесь много неизвестных.
Тем не менее, будет интересно посмотреть, как все это объединяется.
Ответ 6
Нет, не будет. Вы все равно должны явно перенаправлять вызовы на другие потоки через один из многих механизмов, поддерживаемых F #.
Ответ 7
Я понимаю, что это не будет, но Параллельные расширения изменяются, чтобы сделать его потребляемым с помощью F #. Который не сделает его автоматически многопоточным, должен сделать его очень легким.
Ответ 8
Ну, у вас есть свой ответ, но я просто хотел добавить, что я считаю, что это самое значительное ограничение F #, вытекающее из того, что это гибридный императив/функциональный язык.
Я хотел бы увидеть некоторое расширение для F #, объявляющее функцию чистой. То есть, он не имеет побочных эффектов, которые не обозначаются типом функции. Идея заключалась бы в том, что функция чиста, только если она ссылается на другие "известные-чистые" функции. Конечно, это было бы полезно, только если бы тогда можно было потребовать, чтобы делегат, переданный как параметр функции, ссылался на чистую функцию.