Делаю многопоточную программулину. Одни потоки наполняют из сети буфера, другие делают с ними какую-нить работу, третьи - данные из буферов отправляют данные дальше по сети.
Столкнулся со странным поведением - тормоза на ровном месте. При 1 input thread, 1 process, 1 output нагрузка проца - около 10%.
Такая же схема, только с другим обработчиком (process) - тоже около 10%.
А когда все запущено вместе (1 input, 2 process, 2 output), начинаются тормоза и переполнения буферов, хотя нагрузка проца сильно далека от 100%...
Сложных блокировок, мешающих работать - вроде бы нету. Все локи достаточно аккуратные (на мой взгляд).
Внутри тредов тормозить особо и нечему. Есть recv, есть fwrite, есть кой-какая обработка потоков, есть множество sleep (спит один процесс, ожидая данных от предыдущего в цепочке процесса).
Почитал это - http://www.python.org/doc/faq/library/#id15
Там говорится, что процессы запускаются строго поочередно, "что б не повредить случайно что-нить параллельной записью". Нафига тогда, спрашивается, нужны локи, если умный интерпретатор с помощью GIL сам лочит всё и вся?
Загадочное шаманство в time.sleep(0.001) в начале run() каждого треда тоже не очень понятно.
В общем, вопрос - как получить настоящую многопоточность в python?