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

Java: совместное использование воркеров в пуле потоков для нескольких рекурсивных задач

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

Задача = веб-сканер, который отправляет первое задание в пул потоков.
Это задание может генерировать больше заданий и т. Д.
Одно задание = один запрос ввода-вывода HTTP.

Проблема
Предположим, что есть только одна выполняющаяся задача, которая сгенерировала 10000 заданий.
Эти задания теперь поставлены в очередь пула потоков, и все 100 потоков используются для их выполнения.

Предположим, я сейчас отправляю вторую задачу.
Первое задание второй задачи занимает 10001-е место в очереди.
Оно будет выполнено только после 10000 заданий, поставленных в очередь первой задачей.
Итак, это проблема - я не хочу, чтобы вторая задача так долго ждала, чтобы начать свою первую работу.

Идея
Моя первая идея - создать настраиваемую BlockingQueue и передать ее конструктору пула потоков.
Эта очередь будет содержать несколько блокировок. очереди, по одной для каждой задачи.
Затем ее метод take выберет случайную очередь и возьмет из нее элемент.
Моя проблема с этим в что я не понимаю, как удалить пустую очередь из этого списка, когда ее задача будет выполнена. Это будет означать, что некоторые или все рабочие могут быть заблокированы в методе take, ожидая выполнения заданий от задач, которые были завершены.

Это лучший способ решить эту проблему?
Мне не удалось найти никаких шаблонов для этого ни в книгах, ни в Интернете :(

Спасибо!


  • Вы можете проверить это: stackoverflow.com/questions/807223/. Если вы можете заставить свои задачи реализовать Comparable, решения здесь, вероятно, будут работать хорошо. 25.07.2012
  • Как насчет использования очереди с приоритетом LIFO, т.е. последняя отправленная задача получает наивысший приоритет? 26.07.2012

Ответы:


1

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

24.07.2012
  • Я согласен, используйте один пул для запроса верхнего уровня и другой для дочерних запросов. Вы можете просто ограничить размеры двух пулов (т.е. первый пул имеет 10, второй - 100). 25.07.2012
  • @MadProgrammer, я не понимаю, зачем мне 2 пула: один для запросов верхнего уровня и один для дочерних запросов. Не могли бы вы объяснить это поподробнее? 30.07.2012
  • @OlegGolovanov основная причина наличия двух пулов заключается в том, что когда вы истощаете второй пул и любые новые запросы ставятся в очередь и ожидают, первый пул может продолжать обрабатывать входящие запросы. Это также позволяет назначать приоритеты двум пулам отдельно. 31.07.2012

  • 2

    Я бы предложил использовать одну PriorityBlockingQueue. и используя «глубину» рекурсивных задач для вычисления приоритета. В одной очереди рабочие блокируются, когда очередь пуста, и нет необходимости в логике рандомизации для нескольких очередей.

    26.07.2012
    Новые материалы

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

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

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

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

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

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

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