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

Ограничение одновременных потоков

Я использую потоки в программе, которая загружает файлы через sftp. Количество файлов, которые могут быть загружены, потенциально может быть очень большим или очень маленьким. Я хотел бы иметь 5 или менее одновременных загрузок, и если их больше, пусть они подождут. Насколько я понимаю, обычно для этого используется условная переменная, но мне кажется, что это позволяет использовать только 1 поток за раз.

cv = ConditionVariable.new

t2 = Thread.new {
  mutex.synchronize {
    cv.wait(mutex)
    upload(file)
    cv.signal
  }
}

Я думаю, что это должно сказать ему подождать, пока резюме будет доступно, и выпустить его, когда закончите. Мой вопрос: как я могу сделать это, позволяя более 1 за раз, при этом ограничивая количество?

редактировать: я использую Ruby 1.8.7 в Windows из установщика в 1 клик

14.06.2011

  • Версия Ruby, которую вы используете, важна для этого вопроса. 14.06.2011

Ответы:


1

Вместо этого используйте ThreadPool. См. Взаимоблокировка в ThreadPool (в частности, принятый ответ).

14.06.2011

2

Предостережение: в Ruby нет реального параллелизма, если только вы не используете JRuby. Кроме того, исключение в потоке заморозит основной цикл, если вы не находитесь в режиме отладки.

require "thread"

POOL_SIZE = 5

items_to_process = (0..100).to_a

message_queue = Queue.new

start_thread = 
  lambda do
    Thread.new(items_to_process.shift) do |i|
      puts "Processing #{i}"
      message_queue.push(:done)
    end
  end

items_left = items_to_process.length

[items_left, POOL_SIZE].min.times do
  start_thread[]
end

while items_left > 0 
  message_queue.pop
  items_left -= 1
  start_thread[] unless items_left < POOL_SIZE
end
14.06.2011
  • Это неправда. Версия 1.9.2 MRI использует собственные потоки/потоки ядра с GIL. Это не так эффективно, как потоки JRuby или MacRuby, но они и не являются зелеными потоками, которые есть в 1.8.7. В случае выполнения работы ввода-вывода (как следует из вопроса) потоки 1.9.2 весьма полезны (просто посмотрите на Typhoeus, если не верите мне). 14.06.2011
  • @coreyward Согласен. Я всегда думал, что даже в 1.8.7 ввод-вывод фактически делается параллельно. Трудно поверить, что Ruby использует блокировку вызовов системы ввода-вывода, которая замораживает планировщик. Кроме того, пулы потоков можно использовать для ограничения использования сокетов, дескрипторов файлов и т. д. 14.06.2011
  • Новые материалы

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

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

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

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

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

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

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