deye
Lexander, объясните, пожалуйста, что вы имеете ввиду под проверкой лока?
lock.locked()
deye
Убрал использование локов, сделал очередь с результатами и один поток, который пишет данные из этой очереди -> Не помогло.
Этот совет касался других проблем, которые я описал выше.
deye
Насчёт потребляемой памяти: с момента запуска до момента замедления (примерно 20 мин) употребление памяти увеличилось примерно на 5мб. Это серьёзно?
Нет, это мало.
Сколько вы говорите у вас потоков - 100 и более?
Это может в корне изменить источник проблемы.
Специально пишу - это гипотезу, которую нужно проверить, а то мы уже с памятью начали бороться, хотя по факту, оказывается, ее мало расходуется.
Добавьте в список потенциальных причин GIL и переключения контекста между потоками - вот здесь тратится время.
Чтобы проверить эту гипотезу, проверьте время до замедления с разным количеством потоков.
Если она подтвердится,
либо уменьшить количество потоков - этот вариант подойдет, если сетевой интерфейс нагружен на 50 и более процентов;
либо переписать код на multiprocessing, twisted, asyncore и т.п. вещах
Вообще, любой IO лучше писать на потоках или асинхронно.
Сеть - это тоже IO.
Профилирование с ObjGraph вы все таки проведите, чтобы удостоверится в отсутствии большого количества зависших объектов, которые нужно почистить - на это тоже тратится время.