LINUX.ORG.RU

python, треды и локи


0

0

Делаю многопоточную программулину. Одни потоки наполняют из сети буфера, другие делают с ними какую-нить работу, третьи - данные из буферов отправляют данные дальше по сети.

Столкнулся со странным поведением - тормоза на ровном месте. При 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?

★★★★★

Сейчас работает эта прога на фоне, а комп ощутимо тормозит. Такое чувство, что ухудшилась латентность (linux2.6, cfq), хотя просто тяжелые аппликухи таких тормозов не создают.

Загрузка проца - 15-20% (duron 1.6)

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

Слушай, а потоки у тебя там не создаются постоянно из-за ошибки?

Я заметил, что тормоза на ровном месте появляются при большом количестве форков.

smartly ★★★
()
Ответ на: комментарий от smartly

Нет, форков нету, потоки создаются один раз, фиксированного количества.

А, ну еще встроенный веб-сервер (basehttp), на тредах, по нему я мониторю, что унутре творится.

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

То есть ты его постоянно опрашиваешь, чтобы получит состояние? Может он на каждый коннект создаёт поток?

smartly ★★★
()
Ответ на: комментарий от smartly

Создает. Данных состояния там - 3 переменных от каждого из 4-х запущенных тредов.

И даже такой поток создается секунды полторы-две (ужас дикий), хотя непосредственно сам запрос обрабатывается за единицы миллисекунд.

AngryElf ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.