Nano Hash - криптовалюты, майнинг, программирование

определение одновременных задач в потоке данных TPL

У меня есть 1000 элементов в блоке потока данных TPL, каждый элемент будет вызывать внешние веб-сервисы.

веб-сервис поддерживает максимум 10 одновременных вызовов, что легко достигается с помощью:

new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 10
    ...
}

Веб-служба требует, чтобы каждому вызову был передан уникальный идентификатор, который отличает его от других одновременных вызовов. Теоретически это должен быть guid, но на практике 11-й GUID даст сбой, потому что механизм дросселирования на сервере медленно распознает завершение первого вызова.

Поставщик предлагает переработать направляющие, оставив 10 активно используемых.

Я намерен иметь массив GUIDS, каждая задача будет использовать (Interlocked.Increment(ref COUNTER) % 10) в качестве индекса массива

EDIT: я только что понял, что это не сработает! Предполагается, что задачи будут выполняться в том порядке, в котором они могут не выполняться. Я мог бы реализовать это как очередь идентификаторов, где каждая задача заимствует и возвращает один, но вопрос остается в силе, есть ли более простой, предварительно встроенный потокобезопасный способ сделать это?

(для переполнения счетчика COUNTER никогда не будет достаточно вызовов)

Но меня несколько раз удивлял С# (я новичок в .net), что я реализую то, что уже существует.

Есть ли лучший потокобезопасный способ повторного использования каждой задачи из пула идентификаторов?


Ответы:


1

Создание пулов ресурсов — это как раз та ситуация, для которой полезно System.Collections.ConcurrentBag<T>. Заверните его в BlockingCollection<T>, чтобы упростить код.

class Example
{
    private readonly BlockingCollection<Guid> _guidPool;
    private readonly TransformBlock<Foo, Bar> _transform;     

    public Example(int concurrentLimit)
    {
        _guidPool = new BlockingCollection<Guid>(new ConcurrentBag<Guid>(), concurrentLimit)
        for(int i = 0: i < concurrentLimit; i++)
        {
            _guidPool.Add(Guid.NewGuid());
        }

        _transform = new TransformBlock<Foo, Bar>(() => SomeAction, 
                                                  new ExecutionDataflowBlockOptions
                                                  {
                                                     MaxDegreeOfParallelism = concurrentLimit
                                                     //...
                                                  });
        //...
    }

    private async Task<Bar> SomeAction(Foo foo)
    {
        var id= _guidPool.Take();
        try
        {
             //...
        }
        finally
        {
            _guidPool.Add(id);
        }
    }
}
26.06.2017
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..