F#: Асинхронный и Задачи и PLINQ, о, мой!

Когда F# выходит, я собираюсь иметь затруднение богатства в асинхронной области / области параллельного программирования. Ответ на этот вопрос делает довольно хорошее задание описания различий между Задачами, Параллельным LINQ и Реактивной Платформой, но я задавался вопросом, как асинхронные рабочие процессы вписываются в изображение, точно.

Исправьте меня, если я неправ, но насколько я понимаю асинхронные рабочие процессы будут самым легким способом работать с операциями IO-bound, особенно те, которым определили метод AsynchXxx или следуют за шаблоном BeginXxx/EndXxx. Другое преимущество состоит в том, что асинхронные рабочие процессы компонуемы, и могут быть созданы из других асинхронных рабочих процессов - который может допускать большую гибкость в способе, которым структурирована программа.

Я предполагаю то, с чем я нуждаюсь в помощи, понимает, при каких обстоятельствах я предпочел бы Tasks или PLINQ по асинхронным рабочим процессам в коде F#. Я полагаю, что считал, что Библиотека Параллели Задачи имеет более сложные способы сбалансировать загрузку через ядра. Если это правда, то Задачами мог бы быть лучший выбор для чисто Зависящих от ЦП операций, которые должны работать параллельно. PLINQ, с другой стороны, кажется, главным образом удобный способ параллелизировать существующий код, который работает с последовательностями.

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

8
задан Community 23 May 2017 в 11:59
поделиться

2 ответа

Попробуйте вызвать новый ActiveXObject:


function testForActiveX(){
    tester = null;
    try {
        tester = new ActiveXObject('htmlfile');
    }
     catch (e) {
        // catch the exception
    }
    if (tester) {
        // ActiveX is installed
        return true;
    }
    return false;
}
-121--1742766-

Я не вижу, чем кодирование произвольного набора битов отличается от сжатия/кодирования любых других форм данных. Обратите внимание, что вы накладываете только свободное ограничение на кодируемые биты: а именно, это списки битов. С этим небольшим ограничением этот список битов становится просто данными, произвольными данными, и это то, что «нормальные» алгоритмы сжатия сжимаются.

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

Учитывая ваши предпосылки и то, как работают алгоритмы сжатия, я бы посоветовал сделать следующее:

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

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

ЕСЛИ ТОЛЬКО вы не знаете что-то из ваших данных или какое-то преобразование в тех списках, которые заставляют их поднимать какой-то образец. Возьмем, например, кодирование DCT коэффициентов в кодировании JPEG. Способ перечисления этих коэффициентов (диагональных и зигзагообразных) сделан в пользу образца на выходе различных коэффициентов для преобразования. Таким образом, к полученным данным могут применяться традиционные сжатия. Если вы знаете что-то из тех списков битов, которые позволяют перегруппировать их более сжимаемым способом (способ, который показывает некоторые более структуры), то вы получите сжатие.

-121--2771399-

См. Параллельная библиотека задач по сравнению с асинхронными рабочими процессами .

Я бы резюмировал основы следующим образом:

Task Parallel Library : Позволяет нескольким блокам работы эффективно работать на нескольких ядрах, включая относительно простые сценарии, такие как создание нескольких потоков для выполнения аналогичных вычислений параллельно, а также более сложные операции, где сами вычисления также приводят к созданию дополнительных задач. Использует улучшенный threadpool .NET 4.0 и рабочие очереди кражи для обеспечения занятости всех ядер.

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

PLINQ : Код, написанный с помощью PLINQ, работает через TPL, но это более удобный интерфейс для кода, который легко выражается с помощью запросов LINQ (например, выполнение одной операции над каждым предметом в массиве данных параллельно).

Обратить внимание, что async технологические процессы могут быть преобразованы в Задачи, используя метод StartAsTask , и Задачи могут быть преобразованы в Async с, используя Async. Метод AwaitTask ,Таким образом, можно объединить технологии, хотя они нацелены на несколько другие целевые сценарии.

По моему мнению, главное правило состоит в том, что если вы активно выполняете много вычислений на разных потоках, вы захотите использовать TPL (возможно, через PLINQ или эквивалент F #, такой как модуль PSeq), тогда как если вы пытаетесь выполнять много операций ввода-вывода (параллельных или нет), вы должны использовать асинхронные рабочие процессы. Так что raytracer будет использовать TPL для запуска задач, чтобы визуализировать каждый пиксель (или scanline) параллельно, максимизируя доступную вычислительную мощность на компьютере. Но загрузка множества веб-страниц будет выполнена с асинхронными рабочими процессами, так как нет большого количества вычислений для распространения среди ядер; вы просто должны быть уведомлены ОС, когда результаты поступят.

12
ответ дан 5 December 2019 в 12:58
поделиться

async Projects Projects реализуются через монадический синтаксис F #. Это означает, что вместо того, чтобы преобразовать ваши рабочие процессы в задачу, вы можете написать свою собственную версию «async», которая была основана на параллельной библиотеке задач. Я говорю это с парой предостережений:

  • было бы трудно сделать.
  • Асинхронизация, которые используют шаблон BeartXxx / Endxxx в .NET Regifor Recorbacks в пуле резьбы. Я не уверен, что вы можете изменить это, чтобы перенаправить их использовать задачи вместо этого.

Для более подробной информации о том, как реализовать монад в F #, см. Книгу «Expert F #» или Google немного на «F # Monads».

Не полный ответ, который я знаю, но надеюсь, что это немного поможет.

1
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

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