Некоторые случайные мысли здесь:
Я неплохо справился с несколькими сотнями таких потоков в Java; это можно сделать с помощью правильного языка. (Но я не пробовал это в Python.)
На любом языке вы можете запустить код главного узла в одном потоке; просто сделайте так, чтобы он непрерывно зацикливался, запуская код для каждого мастера в каждом цикле. Однако таким образом вы потеряете преимущества нескольких ядер. С другой стороны, вы также избавитесь от проблем многопоточности. (Вы могли бы иметь, скажем, 4 таких потока, используя ядра, но возвращая головную боль многопоточности. Это также снизит накладные расходы на потоки, но тогда есть блокировка...)
Одна большая проблема, с которой я столкнулся, заключалась в том, что потоки блокировали друг друга. Разрешение 100 потокам вызывать один и тот же метод для одного и того же объекта в одно и то же время, не дожидаясь друг друга, требует некоторого размышления и даже исследования. Я обнаружил, что моя многопоточная программа поначалу часто использовала только 25% 4-ядерного процессора, даже при полной загрузке. Это может быть одной из причин, по которой вы бежите медленно.
Не позволяйте подчиненным узлам повторять отправку данных. Главные узлы должны оживать в ответ на поступающие данные, или иметь какой-то способ их хранения до тех пор, пока они не оживут, или некоторую комбинацию.
Стоит иметь больше потоков, чем ядер. Когда у вас есть два потока, они могут блокировать друг друга (и будут, если они будут делиться какими-либо данными). Если у вас есть код для запуска, который не будет блокироваться, вы хотите запустить его в своем собственном потоке, чтобы он не ждал, пока код, который блокируется, разблокируется и завершится. Я обнаружил, что как только у меня появилось несколько потоков, они начали множиться как сумасшедшие — отсюда и моя программа с сотнями потоков. Даже когда 100 потоков блокируются в одном месте, несмотря на всю мою гениальность, есть множество других потоков, чтобы занять ядра!
person
RalphChapin
schedule
30.09.2013