Использование многопоточности / многопроцессорности для ускорения накопления l oop с общими ресурсами - PullRequest
0 голосов
/ 26 апреля 2020

Я разрабатывал алгоритм для решения доски Boggle, WebBoggle . Мне удалось использовать python3, но сейчас я пытаюсь оптимизировать его, чтобы он работал как можно быстрее, и я хотел использовать многопоточность или многопроцессорность, чтобы добиться ускорения.

Область, в которой, как мне кажется, это может получиться, - это for l oop в начале алгоритма, который многократно вызывает тяжелую функцию, например:

nodes = [{obj1}, {obj2}, {obj3}, ... , {obj16}]
word_tree = {"children": {"A": {"data": "A", "children" :{...}}, "B": {"data": "B", "children": {...}}, ...}}

def doSomeWork():
    found_words = []
    for i in range(15):
        found_values += doHeavyLifting(nodes[i], word_tree.children["A"])
    return found_words

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

Объект word_tree (надеюсь, он был изображен явно выше), однако, модифицируется функцией doHeavyLifting, но в сегментах ie word_tree содержит много nodes в нем, и если требуется блокировка, она будет получена для отдельного node, а не для всего word_tree, например, функция может что-то изменить в узле A, но ей не нужно блокировать дочерние элементы узла A ( ссылки на которые хранятся в children dict узла A.

В конечном итоге возвращаемое значение doHeavyLifting сохраняется в массиве found_words и возвращается после обработки всех nodes. (doHeavyLifting - рекурсивная функция, но я не уверен, что это имеет значение для этого вопроса ...)

Я никогда не использовал многопоточность в Python и многопроцессорность, и мне было интересно, как Я хотел бы go реализовать эту l oop таким образом, чтобы с 16 потоками ЦП каждый элемент в массиве nodes мог обрабатываться одновременно (или аналогично, в зависимости от ситуации, с учетом системных ресурсов) и для индивидуального возврата значения, которые будут сохранены в одной переменной, которая будет возвращена функцией doSomeWork.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...