kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Vaibhav
Vaibhav
Вопрос

Лучшая практика проектирования многопоточности

Рассмотрим такую проблему: у меня есть программа, которая должна получить (допустим) 100 записей из базы данных, а затем для каждой из них получить обновленную информацию из веб-сервиса. Есть два способа внедрить параллелизм в этот сценарий:

  1. Я запускаю каждый запрос к веб-сервису на новом потоке. Количество одновременных потоков контролируется каким-то внешним параметром (или динамически настраивается каким-то образом).

  2. Я создаю более мелкие партии (допустим, по 10 записей) и запускаю каждую партию в отдельном потоке (в нашем примере - 10 потоков).

Какой подход лучше, и почему вы так думаете?

3 2008-08-13T19:03:21+00:00 4
Chris Barlow
Chris Barlow
Редактировал вопрос 8-го февраля 2012 в 8:23
Программирование
multithreading
.net
Решение / Ответ
Orion Edwards
Orion Edwards
13-го августа 2008 в 11:35
2008-08-13T23:35:50+00:00
Дополнительно
Источник
Редактировать
#8417165

Выбор 3 является лучшим:

Используйте Async IO.

Если Ваша обработка запроса не сложна и тяжела, Ваша программа собирается потратить 99% it' s время, ожидая запросов HTTP.

Это точно, что Async IO разработан для - Позволяют стопке организации сети окон (или .net структура или безотносительно) беспокойство обо всем ожидании, и просто используют единственную нить, чтобы послать и ' выберите up' результаты.

К сожалению.NET структура делает его правильной болью в заднице. It' s легче, если you' ре, просто используя сырые гнезда или Win32 api. Here' s (проверенный!) пример, используя C#3 так или иначе:

using System.Net; // need this somewhere

// need to declare an class so we can cast our state object back out
class RequestState {
    public WebRequest Request { get; set; }
}

static void Main( string[] args ) {
    // stupid cast neccessary to create the request
    HttpWebRequest request = WebRequest.Create( "http://www.stackoverflow.com" ) as HttpWebRequest;

    request.BeginGetResponse(
        /* callback to be invoked when finished */
        (asyncResult) => { 
            // fetch the request object out of the AsyncState
            var state = (RequestState)asyncResult.AsyncState; 
            var webResponse = state.Request.EndGetResponse( asyncResult ) as HttpWebResponse;

            // there we go;
            Debug.Assert( webResponse.StatusCode == HttpStatusCode.OK ); 

            Console.WriteLine( "Got Response from server:" + webResponse.Server );
        },
        /* pass the request through to our callback */
        new RequestState { Request = request }  
    );

    // blah
    Console.WriteLine( "Waiting for response. Press a key to quit" );
    Console.ReadKey();
}

ОТРЕДАКТИРУЙТЕ:

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

 C1pher
C1pher
Редактировал ответ 10-го января 2014 в 4:30
6
0
Derek Park
Derek Park
13-го августа 2008 в 7:19
2008-08-13T19:19:32+00:00
Дополнительно
Источник
Редактировать
#8417139

Два момента, которые необходимо учитывать.

1. Сколько времени потребуется на обработку записи?

Если обработка записи происходит очень быстро, накладные расходы на передачу записей потокам могут стать узким местом. В этом случае вы захотите объединить записи, чтобы не передавать их так часто.

Если обработка записей достаточно длительная, разница будет незначительной, поэтому более простой подход (1 запись на поток), вероятно, будет лучшим.

2. Сколько потоков вы планируете запустить?

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

2
0
 Hugo
Hugo
13-го августа 2008 в 7:34
2008-08-13T19:34:24+00:00
Дополнительно
Источник
Редактировать
#8417150

Компьютер, на котором выполняется программа, вероятно, не является узким местом: Помните, что протокол HTTP имеет заголовок keep-alive, который позволяет посылать несколько GET-запросов на одном и том же сокете, что избавляет вас от рукопожатия TCP/IP. К сожалению, я не знаю, как использовать это в библиотеках .net. (Должно быть возможно.)

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

0
0
Анонимный пользователь
13-го августа 2008 в 7:40
2008-08-13T19:40:41+00:00
Дополнительно
Источник
Редактировать
#8417155

Получите Parallel Fx. Посмотрите на коллекцию BlockingCollection. Используйте поток для подачи в нее партий записей, и от 1 до n потоков, извлекающих записи из коллекции для обслуживания. Вы можете контролировать скорость подачи коллекции и количество потоков, которые обращаются к веб-сервисам. Сделайте его настраиваемым с помощью ConfigSection и сделайте его общим, подавая коллекцию делегатам Action, и у вас будет хороший маленький дозатор, который вы сможете использовать по своему усмотрению.

0
0
Похожие сообщества 12
DotNetRuChat
DotNetRuChat
6 652 пользователей
Чат русскоязычного .NET сообщества http://dotnet.ru/ Правила: https://t.me/DotNetRuChat/704399 Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia, @DotNetRuJobs, @uwp_ru Флуд в @dotnettalks
Открыть telegram
Вакансии .NET
Вакансии .NET
3 530 пользователей
Правила: https://t.me/DotNetRuJobs/123 Канал с вакансиями - https://t.me/DotNetRuJobsFeed Вам могут быть интересны: @dotnetruchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia Флуд в @dotnettalks
Открыть telegram
pro.net
pro.net
1 820 пользователей
Обсуждение .NET и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). https://t.me/pro_net/34653 Флудилка: @dotnettalks
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
.NET Talks - День сурка
.NET Talks - День сурка
1 324 пользователей
Свободный чат .NET разработчиков. Правила: https://t.me/dotnettalks/548269 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @DotNetRuJobs, @uwp_ru, @AvaloniaRu, @dotnettalksenglish
Открыть telegram
Чат конференции DotNext
Чат конференции DotNext
987 пользователей
Канал конференции: @dotnext_channel Ближайшая конференция — DotNext 2022 Autumn, даты будут анонсированы позднее Билеты https://tinyurl.com/DotNext2023Autumn Саппорт: @JUGConfSupport_bot
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией