Многопоточный менеджер по очереди заданий

Я думаю, что Tiw указал на вашу первую проблему, но есть несколько.

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

Я также включил более рубиновую версию.

def jotto()
    file_content = File.readlines("words.txt")
    i = 0
    new_array = []
        while i < file_content.length 
            temp_str = file_content[i].chomp  #added
            if temp_str.length == 4
                new_array << temp_str
            end
            i = i + 1
        end

    answer = new_array[rand(new_array.length)]

    puts(answer)

    puts "Guess the secret word"

    # you need to get the word from the user inside the while loop.
    # word = gets

    # word_array = []

    # word_array << word  # This adds the word to an array of strings .. you want to turn the string into an array of characters

    #i = 0  # not used
        # added
        word = nil
        while answer != word
            #added
            word = gets.chomp
            word_array = word.chars # see comment above
            iterations = 0
            w = 0
            while iterations < word.length  # was <=

                if answer.include? word_array[iterations]  # == true
                    w = w + 1
                end
                iterations = iterations + 1
            end
        puts("That's not correct but there are " + w.to_s + " of the same letters") if word != answer # there are better ways.
        end
    print("Yes! " + answer + " is the right answer!")

end
jotto()

Более рубиновый способ ведения дел

def jotto()
    answer_list = File.readlines("words.txt").map { |line| line.strip } # map each read line into an array of strings without any whitespace
    answer = answer_list.sample  # get a random element 
    puts answer  #for debug only
    puts "Guess the secret word"

    loop do
        guess = gets.strip 
        break if guess == answer  # exit the loop if correct 
        # map each char in answer to an array of true/false depending on if it matches the guess position
        matched_positions = answer.chars.each_with_index.map { |char ,index| char == guess[index] } 
        number_of_matching_positions = matched_positions.count(true) # count the number of true entires (positions that matched)
        puts("That's not correct but there you did match #{number_of_matching_positions} positions - try again")
    end
    puts "Yes! " + answer + " is the right answer!"
end

jotto()
32
задан Community 23 May 2017 в 10:30
поделиться

10 ответов

Microsoft работает над рядом технологий для следующей Версии Visual Studio 2010, названный Временем выполнения Параллелизма, Параллельной Библиотекой Шаблона и Асинхронной Библиотекой Агентов, которая, вероятно, поможет. Время выполнения Параллелизма предложит основанное на политике планирование, т.е. разрешение Вам управлять и составить несколько экземпляров планировщика (подобный пулам потоков, но с affinitization и выравниванием нагрузки между экземплярами), Параллельная Библиотека Шаблона предложит основанное на задаче программирование и параллельные циклы с STL как модель программирования. Библиотека Agents предлагает основанную на агенте модель программирования и имеет поддержку создания параллельных конвейеров потока данных, т.е. управления теми зависимостями, описанными выше. К сожалению, это еще не выпущено, таким образом, можно читать об этом на нашем блог команды или посмотреть некоторые видео на channel9 существует также очень большой CTP, который доступен для скачивания также.

при поиске решения сегодня Стандартные блоки Потока Intel и библиотека поточной обработки повышения являются и хорошими библиотеками и доступный теперь. JustSoftwareSolutions выпустил реализацию станд.:: поток, который соответствует C++ 0x проект и конечно OpenMP, широко доступен при рассмотрении мелкомодульного основанного на цикле параллелизма.

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

- Рик

4
ответ дан 27 November 2019 в 21:09
поделиться

Что-то хотело бы пул потоков быть полезным для Вас? Это основано на повышении:: потоки и в основном реализуют простую очередь задачи потока, которая выдает функции рабочего к объединенным потокам.

3
ответ дан 27 November 2019 в 21:09
поделиться

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

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

5
ответ дан 27 November 2019 в 21:09
поделиться

Мы должны были создать нашу собственную систему очереди заданий для соответствия требованиям, подобным Вашей (поток UI должен всегда отвечать в 33 мс, задания могут работать от 15-15000ms), потому что действительно не было ничего там, которое вполне удовлетворило наши потребности, уже не говоря о было производительно.

, К сожалению, наш код является почти столь же собственным, как собственный добирается, но я могу дать Вам некоторые самые существенные функции:

  • Мы запускаем один поток на ядро в начале программы. Каждый вытягивают, работают от глобальной очереди заданий. Задания состоят из функционального объекта и шарика связанных данных (действительно разработка на func_ptr и пусто *). Распараллельте 0, быстрый клиентский цикл, не позволяется работать над заданиями, но остальные захватывают, как они могут.
  • сама очередь заданий должна быть незапертой структурой данных, такой как свободный от блокировок отдельно связанный список (Visual Studio идет с одним ). Избегайте использования взаимного исключения; конкуренция для очереди удивительно высока, и взаимные исключения захвата является дорогостоящим.
  • Собираются, все необходимые данные для задания в сам объект задания - стараются не иметь указатель от задания назад в основную "кучу", где необходимо будет иметь дело с конкуренцией между заданиями и блокировками и всем что другой медленный, раздражающий материал. Например, все параметры моделирования должны войти в локальный блоб данных задания. Структура результатов, очевидно, должна быть чем-то, что переживает задание: можно иметь дело с этим любой путем a) зависания на объекты задания даже после того, как они закончили работать (таким образом, можно использовать их содержание от основного потока), или b) выделения структуры результатов особенно для каждого задания и наполнения указателя в объект данных задания. Даже при том, что сами результаты не будут жить в задании, это эффективно предоставляет эксклюзивный доступ задания к его выходной памяти, таким образом, Вы не должны путать с блокировками.

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

17
ответ дан 27 November 2019 в 21:09
поделиться

Вы могли бы хотеть посмотреть Поточно-ориентированное программирование - оно основано на потоковой передаче блоков данных между асинхронными компонентами. Существует Java и версии C# драйвера плюс много предварительно кодированных компонентов. Это является внутренне многопоточным - на самом деле, единственный однопоточный код в компонентах, хотя можно добавить ограничения синхронизации к стандартным правилам планирования. Хотя это может быть на слишком мелкомодульном уровне для того, в чем Вы нуждаетесь, может быть материал здесь, можно использовать.

2
ответ дан 27 November 2019 в 21:09
поделиться

Смотрите на повышение:: будущее (но видят также этот обсуждение и предложение ), который похож на действительно хорошую основу для параллелизма (в особенности это, кажется, предлагает превосходную поддержку ситуаций с типом C-depends-on-A-and-B).

я посмотрел на OpenMP немного, но (как Вы) не был убежден, что он будет работать хорошо на что-либо кроме цифрового кода Fortran/C. Intel Стандартные блоки Поточной обработки выглядел более интересным мне.

, Если это прибывает в него, это не слишком твердо к самокрутка сверх повышения:: поток. [Объяснение: поток ферма (большинство людей назвало бы это пулом) привлекает работу из ориентированного на многопотоковое исполнение очередь из функторов (задачи или задания). Посмотрите тесты и сравнительный тест для примеров использования. У меня есть некоторая дополнительная сложность к (дополнительно) задачам поддержки с приоритетами и случай, где выполнение задач может породить больше задач в очередь заданий (это делает знание, когда вся работа на самом деле завершается немного более проблематичная; ссылки на "ожидание" - те, которые могут иметь дело со случаем). Мог бы дать Вам некоторое представление так или иначе.]

1
ответ дан 27 November 2019 в 21:09
поделиться

Вы хотели бы смотреть Intel Thread Building Blocks . Я beleave, это делает то, что Вы хотите и с версией 2, это - Открытый исходный код.

1
ответ дан 27 November 2019 в 21:09
поделиться

Существует много распределенных менеджеров ресурсов там. Программное обеспечение, которое отвечает почти всем Вашим требованиям, Механизм Сетки Sun . SGE используется на некоторых мирах самые большие суперкомпьютеры и находится в активной разработке.

существуют также аналогичные решения в Крутящий момент , платформа LSF , и Кондор .

Это кажется, что можно хотеть к самокрутке, но существует много функциональности во всем вышеупомянутом.

1
ответ дан 27 November 2019 в 21:09
поделиться

Я не знаю, ищете ли Вы библиотеку C++ (который я думаю, что Вы), но платформа Ветвления/Соединения Doug Lea для Java 7 довольно изящна, и делает точно, что Вы хотите. Вы, вероятно, смогли бы реализовать его в C++ или найти предварительно реализованную библиотеку.

[еще 112] информация здесь: http://artisans-serverintellect-com.si-eioswww6.com/default.asp?W1

0
ответ дан 27 November 2019 в 21:09
поделиться

Возможно, немного поздно, но взгляните также на ThreadWeaver: http://en.wikipedia.org/wiki/ThreadWeaver

0
ответ дан 27 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: