none
Какой это такой сторонний эффект имеет метод ParallelEnumerable.ForAll<TSource>? RRS feed

  • Вопрос

  • В MSDN написано, что метод ParallelEnumerable.ForAll<TSource> имееет сторонний эффект, но в чём заключается этот стронний эффект - не написано. Так скажите, пожалуйста, кто знает, в чём же он заключается?
    • Перемещено YatajgaEditor 2 сентября 2013 г. 8:42
    2 сентября 2013 г. 8:23

Ответы

  • "имееет сторонний эффект" - скорее всего "побочный эффект", именно этот термин правильный. Под ним подразумевают, то что входные данные могут быть модифицированы не так как вы ожидали (хотя это звучит немного неправильно). Например порядок исходной последовательности может измениться. Чего не может быть при однопоточной обработке последовательности.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа TownSparrow 4 сентября 2013 г. 6:58
    2 сентября 2013 г. 8:58
    Модератор

Все ответы

  • "имееет сторонний эффект" - скорее всего "побочный эффект", именно этот термин правильный. Под ним подразумевают, то что входные данные могут быть модифицированы не так как вы ожидали (хотя это звучит немного неправильно). Например порядок исходной последовательности может измениться. Чего не может быть при однопоточной обработке последовательности.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа TownSparrow 4 сентября 2013 г. 6:58
    2 сентября 2013 г. 8:58
    Модератор
  • В русской версии именно так и написано -
    <sentencetext xmlns="http://www.w3.org/1999/xhtml">"Так как этот метод создает побочный эффект,
    он может использоваться для наблюдения за
    фактическим порядком выполнения в параллельном запросе."</sentencetext>

    Я понимаю так, что любой из элементов исходной последовательности
    может быть обработан в любой момент,
    и поэтому порядок элементов в результативной последовательности
    может отличаться от исходного.
    Это, надо полагать, относительно Collections.Generic.
    А как, интересно, с Collection.Concurrent ?

    2 сентября 2013 г. 9:40
  • Вы немного путаете. Коллекции из пространства имен System.Collections.Concurrent предназначены для потокобезопасной работы с коллекцией. Т.е. если вы будите одновременно писать в них из разных потоков, то у вас не будет ситуации, когда вы из одного потока добавили элемент, из другого потока добавили элемент, а в коллекции вместо двух элементов - один.

    На порядок обработки это не влияет.

    2 сентября 2013 г. 13:44
    Отвечающий
  • Да, это понятно - Collections.Concurrent безопасно доступна нескольким потокам.
    В данном топике вопрос о другом.
    И в то же время возникает вопрос - 
    а как в случае,
    когда ForAll запускает несколько потоков
    для обработки одной коллекции типа Concurrent?
    Хотя все это можно и самому прощупать.

    2 сентября 2013 г. 14:05
  • Еще раз. Проблемы при многопоточном доступе возникают, когда вы из разных потоков модифицируете коллекцию:

    1. Добавляете элементы

    2. Удаляете элементы

    3. Редактируете элементы

    Ни одно из этих действий в рамках ForAll вы выполнить не можете.

    2 сентября 2013 г. 16:11
    Отвечающий
  • Действительно, в MSDN написано как-то невнятно, что по-английски, что по-русски.

    Скажу так: вся суть ParallelEnumerable.ForAll сводится к выполнению побочного эффекта. Большинство методов LINQ возвращают какое-либо значение, если это IEnumerable (или аналог Parallel, Queryable), то их можно соединять в цепочку. А ForAll ничего не возвращает (void), то есть вся его работа сводится к изменению какого-либо внешнего ресурса.

    В случае, если применить этот метод к Concurrent-коллекции, то просто будет медленнее работа.

    2 сентября 2013 г. 16:41
  • "Ни одно из этих действий в рамках ForAll вы выполнить не можете"

    Пофантазирую, греха в этом нет -
    Если я имею дело с Collection.Concurrent,
    т.е. из разных потоков "добавляю, удаляю, редактирую",
    но при этом мне периодически нужно обработать всю коллекцию заданным алгоритмом,
    и все это происходит на хорошем многопроцессорном компе,
    то ForAll со своей дополнительной многопоточностью будет очень даже полезен.
    При этом, на первый взгляд, должна быть мешанина -
    одновременное редактирование коллекции и тут же ее обработка.
    Но, по идее, все должно работать...

    2 сентября 2013 г. 17:19
  • Спасибо за информацию. Полезная.

    4 сентября 2013 г. 6:58