Некоторые случайные мысли здесь:
я довольно хорошо с несколькими сотнями нитей, работающих, как это в Java; это можно сделать с помощью правильного языка. (Но я не пробовал это в Python.)
На любом языке вы могли бы запустить код главного узла в одном потоке; просто продолжайте цикл, запуская код для каждого мастера в каждом цикле. Тем не менее, вы потеряете преимущества нескольких ядер. С другой стороны, вы также потеряете проблемы многопоточности. (Вы могли бы сказать, скажем, 4 таких нити, используя ядра, но получая многопоточную головную боль назад. Это также будет препятствовать потоку вниз, но тогда есть блокировка ...)
Одна большая проблема, с которой я столкнулся были потоки, блокирующие друг друга. Включение 100 потоков для одновременного вызова одного и того же метода на одном и том же объекте, не ожидая друг друга, требует немного размышлений и даже исследований. Я обнаружил, что моя многопоточная программа сначала часто использовала только 25% четырехъядерного процессора даже при запуске. Это может быть одна из причин, по которой вы работаете медленно.
Не нужно, чтобы ваши подчиненные узлы повторяли отправку данных. Ведущие узлы должны ожить в ответ на поступающие данные, или есть способ хранения, пока они не оживают, или некоторая комбинация.
Плата за то, что у него больше потоков, чем ядер. Когда у вас есть два потока, они могут блокировать друг друга (и будут, если они будут делиться любыми данными). Если у вас есть код для запуска, который не будет блокироваться, вы хотите запустить его в своем собственном потоке, чтобы он не ожидал, что код блокируется, чтобы разблокировать и завершить. Я нашел один раз, когда у меня было несколько потоков, они начали размножаться как сумасшедшие - отсюда моя программа сотнями нитей. Даже когда 100 нитей блокируются в одном месте, несмотря на весь мой блеск, есть много других потоков, чтобы поддерживать ядро!
Вы должны рассмотреть возможность осуществления какой-либо (потоковой) очереди или, по крайней мере, диспетчера для управления потоком информации. Однако трудно сказать, не зная, чего вы хотите добиться. – tamasgal
Запуск 1600 потоков, конечно, приведет к плохой производительности на обычном компьютере. Вам может потребоваться рассмотреть высокопроизводительный компьютер, или вы можете попытаться использовать свой GPU для большей вычислительной мощности. GPU хорош для многопоточности. – justhalf
@justhalf Конечно, это будет плохо. Каждый поток активен только в течение нескольких миллисекунд в секунду и спящий остаток времени, поэтому я думаю, что проблема заключается не в ресурсах центрального процессора, а в том, что количество ядер или просто простое существование многих потоков и контекст переключает их требуют. Вместо 1600 я должен сказать даже 10 000. Я ищу хорошее решение для аппроксимации этих узлов, работающих параллельно, чтобы максимизировать количество узлов, которые я могу запустить. Я не думаю, что переезд на GPU действительно поможет здесь. – Liron