Я разрабатывал алгоритм для решения доски 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
.
Спасибо!