[Python] реализация мультипотокового TCP Server-а
От: C0x  
Дата: 16.06.10 07:51
Оценка:
http://docs.python.org/library/socketserver.html
Имеет смысл для прокси сервиса с кучей клиентов?

PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.
Re: [Python] реализация мультипотокового TCP Server-а
От: neFormal Россия  
Дата: 16.06.10 08:12
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>http://docs.python.org/library/socketserver.html

C0x>Имеет смысл для прокси сервиса с кучей клиентов?

на любителя.. может лучше взять, например, java?. или хочется именно скрипты?.

C0x>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


да, многоядерность не будет давать профита изза GIL..
...coding for chaos...
Re[2]: [Python] реализация мультипотокового TCP Server-а
От: C0x  
Дата: 16.06.10 08:20
Оценка:
Здравствуйте, neFormal, Вы писали:

F>на любителя.. может лучше взять, например, java?. или хочется именно скрипты?.


Как раз смотрю в сторону http://quickserver.sourceforge.net
Re: [Python] реализация мультипотокового TCP Server-а
От: Daevaorn Россия  
Дата: 16.06.10 08:41
Оценка: +1
Здравствуйте, C0x, Вы писали:

C0x>http://docs.python.org/library/socketserver.html

C0x>Имеет смысл для прокси сервиса с кучей клиентов?

C0x>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


Лучше использовать что-нибудь асинхронное -- tornado, twisted или asyncore на худой конец.
Re[2]: [Python] реализация мультипотокового TCP Server-а
От: C0x  
Дата: 16.06.10 08:48
Оценка:
Здравствуйте, Daevaorn, Вы писали:

D>Здравствуйте, C0x, Вы писали:


C0x>>http://docs.python.org/library/socketserver.html

C0x>>Имеет смысл для прокси сервиса с кучей клиентов?

C0x>>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


D>Лучше использовать что-нибудь асинхронное -- tornado, twisted или asyncore на худой конец.


А вот к примеру в twisted нет проблемы с потоками из-за GIL? Мне очень важно, чтобы на многоядерной машине сервер использовал все ресурсы процессора, а не ограничивался только одним ядром.
Re[3]: [Python] реализация мультипотокового TCP Server-а
От: Daevaorn Россия  
Дата: 16.06.10 08:54
Оценка: :)
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, Daevaorn, Вы писали:


D>>Здравствуйте, C0x, Вы писали:


C0x>>>http://docs.python.org/library/socketserver.html

C0x>>>Имеет смысл для прокси сервиса с кучей клиентов?

C0x>>>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


D>>Лучше использовать что-нибудь асинхронное -- tornado, twisted или asyncore на худой конец.


C0x>А вот к примеру в twisted нет проблемы с потоками из-за GIL? Мне очень важно, чтобы на многоядерной машине сервер использовал все ресурсы процессора, а не ограничивался только одним ядром.


Twisted работает в одном потоке. Вы просто можете поднять столько инстансов вашего сервиса, сколько у вас ядер.
Re[4]: [Python] реализация мультипотокового TCP Server-а
От: C0x  
Дата: 16.06.10 09:03
Оценка:
Здравствуйте, Daevaorn, Вы писали:

D>Здравствуйте, C0x, Вы писали:


C0x>>Здравствуйте, Daevaorn, Вы писали:


D>>>Здравствуйте, C0x, Вы писали:


C0x>>>>http://docs.python.org/library/socketserver.html

C0x>>>>Имеет смысл для прокси сервиса с кучей клиентов?

C0x>>>>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


D>>>Лучше использовать что-нибудь асинхронное -- tornado, twisted или asyncore на худой конец.


C0x>>А вот к примеру в twisted нет проблемы с потоками из-за GIL? Мне очень важно, чтобы на многоядерной машине сервер использовал все ресурсы процессора, а не ограничивался только одним ядром.


D>Twisted работает в одном потоке. Вы просто можете поднять столько инстансов вашего сервиса, сколько у вас ядер.


Как-то это не очень хорошо получается. Нужно ведь тогда еще данные синхронизировать между инстансами и на один порт их все завязывать.
Re[5]: [Python] реализация мультипотокового TCP Server-а
От: HiSH Россия http://m0riarty.ya.ru
Дата: 16.06.10 09:08
Оценка:
Здравствуйте, C0x, Вы писали:

D>>Twisted работает в одном потоке. Вы просто можете поднять столько инстансов вашего сервиса, сколько у вас ядер.


C0x>Как-то это не очень хорошо получается. Нужно ведь тогда еще данные синхронизировать между инстансами и на один порт их все завязывать.


Для того, чтобы однопоточный *прокси*-сервер нагрузить до предела, нужно *очень* постараться.
А что за данные нужно шарить между инстансами?
Re[6]: [Python] реализация мультипотокового TCP Server-а
От: C0x  
Дата: 16.06.10 09:31
Оценка:
Здравствуйте, HiSH, Вы писали:

HSH>Здравствуйте, C0x, Вы писали:


D>>>Twisted работает в одном потоке. Вы просто можете поднять столько инстансов вашего сервиса, сколько у вас ядер.


C0x>>Как-то это не очень хорошо получается. Нужно ведь тогда еще данные синхронизировать между инстансами и на один порт их все завязывать.


HSH>Для того, чтобы однопоточный *прокси*-сервер нагрузить до предела, нужно *очень* постараться.

HSH>А что за данные нужно шарить между инстансами?

Это не совсем обычный прокси сервер, он еще сохраняет некоторую дополнительную информацию о соединениях + кеширование передаваемых данных.
Re[3]: [Python] реализация мультипотокового TCP Server-а
От: Temoto  
Дата: 16.06.10 09:53
Оценка:
C0x>>>http://docs.python.org/library/socketserver.html
C0x>>>Имеет смысл для прокси сервиса с кучей клиентов?

C0x>>>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.


D>>Лучше использовать что-нибудь асинхронное -- tornado, twisted или asyncore на худой конец.


C0x>А вот к примеру в twisted нет проблемы с потоками из-за GIL? Мне очень важно, чтобы на многоядерной машине сервер использовал все ресурсы процессора, а не ограничивался только одним ядром.


Грубо говоря, вы не сможете создать прокси, который делает что-то вменяемое полезное и при этом нагружает процессор.
Re[7]: [Python] реализация мультипотокового TCP Server-а
От: HiSH Россия http://m0riarty.ya.ru
Дата: 16.06.10 13:38
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, HiSH, Вы писали:


HSH>>Здравствуйте, C0x, Вы писали:


D>>>>Twisted работает в одном потоке. Вы просто можете поднять столько инстансов вашего сервиса, сколько у вас ядер.


C0x>>>Как-то это не очень хорошо получается. Нужно ведь тогда еще данные синхронизировать между инстансами и на один порт их все завязывать.


HSH>>Для того, чтобы однопоточный *прокси*-сервер нагрузить до предела, нужно *очень* постараться.

HSH>>А что за данные нужно шарить между инстансами?

C0x>Это не совсем обычный прокси сервер, он еще сохраняет некоторую дополнительную информацию о соединениях + кеширование передаваемых данных.


Я скажу так: если требование — выжать максимум из одного процесса на одном сервере, то не надо писать это ни на питоне, ни на любом другом скриптовом языке. Асинхронные сокеты + треды + быстрый язык.
Если максимум выжимать не надо — это можно написать на питоне, не глядя на его проблемы с GILом. Это будет на порядок быстрее в разработке. Когда на них наступите — эти части можно будет переписать на C++. Но по своем опыту скажу, чтобы уткнуться в GIL, нужно иметь очень хорошую нагрузку.

Есть несколько мест, про которые нужно помнить, чтобы раньше времени не наступить на проблемы с GIL'ом:
  1. Строковые операции. ('a' * 100000000).replace('aaa', 'bbb') не отпустит GIL и завесит весь процесс на серьезное время.
  2. Регекспы. С ними ровно та же беда, поэтому писать их нужно с головой. В тройке собираются использовать новый модуль, без этой проблемы (а может уже используют?). В любом случае, если регекспы простые, я бы посоветовал написать свой биндинг к http://code.google.com/p/re2/ — они на порядок быстрее.
  3. Всякие подозрительные внешние библиотеки.

Но опять же — проблемы с GIL'ом несколько преувеличены, нужно серьезно постараться, чтобы с ними столкнуться
Re[4]: [Python] реализация мультипотокового TCP Server-а
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.06.10 18:52
Оценка:
Здравствуйте, Temoto, Вы писали:

C0x>>А вот к примеру в twisted нет проблемы с потоками из-за GIL? Мне очень важно, чтобы на многоядерной машине сервер использовал все ресурсы процессора, а не ограничивался только одним ядром.


Twisted их просто игнорирует:)

T>Грубо говоря, вы не сможете создать прокси, который делает что-то вменяемое полезное и при этом нагружает процессор.


Не надо вводить в заблуждение, сможет. С некоторыми затратами умственных ресурсов — сильно больше, чем у хорошо параллелизующейся системы — но сможет. В первую очередь можно применять модуль subprocess (начиная с 2.6 "в коробке"), он порождает системные процессы и даёт связь между ними механизмом очередей.
The God is real, unless declared integer.
Re[5]: [Python] реализация мультипотокового TCP Server-а
От: Temoto  
Дата: 16.06.10 19:03
Оценка:
T>>Грубо говоря, вы не сможете создать прокси, который делает что-то вменяемое полезное и при этом нагружает процессор.

N>Не надо вводить в заблуждение, сможет. С некоторыми затратами умственных ресурсов — сильно больше, чем у хорошо параллелизующейся системы — но сможет. В первую очередь можно применять модуль subprocess (начиная с 2.6 "в коробке"), он порождает системные процессы и даёт связь между ними механизмом очередей.


Вроде бы достаточно уточнений сделал. И "грубо говоря", и "прокси", и "вменяемое", и "полезное". Конечно, сферический проект в вакууме настолько сложен и так много вычисляет, что упрётся в процессор. Но что-то мне подсказывает, что топикстартер будет делать нечто гораздо более приземлённое. И если не твистед и не треды, то в сумме проца оно сожрёт меньше, чем люди потратили на чтение этого треда.

Простите сарказм, если я неправ и там правда пишется нечто CPU-bound. Но пока не верю.
Re[6]: [Python] реализация мультипотокового TCP Server-а
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.06.10 21:17
Оценка:
Здравствуйте, Temoto, Вы писали:

N>>Не надо вводить в заблуждение, сможет. С некоторыми затратами умственных ресурсов — сильно больше, чем у хорошо параллелизующейся системы — но сможет. В первую очередь можно применять модуль subprocess (начиная с 2.6 "в коробке"), он порождает системные процессы и даёт связь между ними механизмом очередей.

T>Вроде бы достаточно уточнений сделал. И "грубо говоря", и "прокси", и "вменяемое", и "полезное". Конечно, сферический проект в вакууме настолько сложен и так много вычисляет, что упрётся в процессор.

Веду совсем не сферический в вакууме проект, собственно вычислений нет, сплошная сетевая активность, одного процессора катастрофически не хватает — приходится делать расщепления "на коленках". Вот опять сегодня гуглил на тему новостей типа "GIL убрали в сторону" — фигушки, пока летим по-старому.

T>Простите сарказм, если я неправ и там правда пишется нечто CPU-bound. Но пока не верю.


Простите за сарказм, но мир более разнообразен, чем кому-то кажется.
The God is real, unless declared integer.
Re[7]: [Python] реализация мультипотокового TCP Server-а
От: Temoto  
Дата: 16.06.10 21:39
Оценка:
N>>>Не надо вводить в заблуждение, сможет. С некоторыми затратами умственных ресурсов — сильно больше, чем у хорошо параллелизующейся системы — но сможет. В первую очередь можно применять модуль subprocess (начиная с 2.6 "в коробке"), он порождает системные процессы и даёт связь между ними механизмом очередей.
T>>Вроде бы достаточно уточнений сделал. И "грубо говоря", и "прокси", и "вменяемое", и "полезное". Конечно, сферический проект в вакууме настолько сложен и так много вычисляет, что упрётся в процессор.

N>Веду совсем не сферический в вакууме проект, собственно вычислений нет, сплошная сетевая активность, одного процессора катастрофически не хватает — приходится делать расщепления "на коленках". Вот опять сегодня гуглил на тему новостей типа "GIL убрали в сторону" — фигушки, пока летим по-старому.


ENOSENSE. Подумайте сами, если вычислений нет, как может не хватать процессора? Миллион сисколов в секунду что-ли?
Re[8]: [Python] реализация мультипотокового TCP Server-а
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.06.10 06:08
Оценка:
Здравствуйте, Temoto, Вы писали:

T>>>Вроде бы достаточно уточнений сделал. И "грубо говоря", и "прокси", и "вменяемое", и "полезное". Конечно, сферический проект в вакууме настолько сложен и так много вычисляет, что упрётся в процессор.


N>>Веду совсем не сферический в вакууме проект, собственно вычислений нет, сплошная сетевая активность, одного процессора катастрофически не хватает — приходится делать расщепления "на коленках". Вот опять сегодня гуглил на тему новостей типа "GIL убрали в сторону" — фигушки, пока летим по-старому.


T>ENOSENSE. Подумайте сами, если вычислений нет, как может не хватать процессора? Миллион сисколов в секунду что-ли?


SIP softswitch. Разбираются входящие пакеты, строятся исходящие, посылаются запросы к биллингу, разбираются ответы. Ведётся база транзакций, база диалогов, база звонков, обмен с соседями частями этих баз. Движок событий, сообщения между подсистемами, очереди сообщений, таймеры, etc.
Собственно "вычислений" на уровне сложений-вычитаний-etc. там дай бог чтобы 1% (самое сложное — правила реавторизации — укладываются в полторы странички простого кода), ну ладно, с арифметикой указателей — 5%. Тем не менее работы — дофига и выше.
Хотите посмотреть, как оно помрёт под нагрузкой — задайте 100 новых звонков в секунду, треска будет на все окрестные сервера:)

Если Вы всё это назовёте "вычислениями" — Вы просто некорректно подобрали термины, но если Вы всерьёз так думаете и игноруете то, что компьютеры в основном занимаются обработкой данных, а не вычислениями — то я вынужден просто посоветовать повторить высшее образование заново. Надеюсь, что это временно (пока жара не спадёт). Извините, ничего личного, но такое наплевательское игнорирование моей работы меня удивляет. И таки да, забирайте свой ENOSENSE обратно, знание жаргона не заменяет самостоятельное мышление.
The God is real, unless declared integer.
Re[9]: [Python] реализация мультипотокового TCP Server-а
От: Temoto  
Дата: 17.06.10 08:44
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Temoto, Вы писали:


T>>>>Вроде бы достаточно уточнений сделал. И "грубо говоря", и "прокси", и "вменяемое", и "полезное". Конечно, сферический проект в вакууме настолько сложен и так много вычисляет, что упрётся в процессор.


N>>>Веду совсем не сферический в вакууме проект, собственно вычислений нет, сплошная сетевая активность, одного процессора катастрофически не хватает — приходится делать расщепления "на коленках". Вот опять сегодня гуглил на тему новостей типа "GIL убрали в сторону" — фигушки, пока летим по-старому.


T>>ENOSENSE. Подумайте сами, если вычислений нет, как может не хватать процессора? Миллион сисколов в секунду что-ли?


N>SIP softswitch. Разбираются входящие пакеты, строятся исходящие, посылаются запросы к биллингу, разбираются ответы. Ведётся база транзакций, база диалогов, база звонков, обмен с соседями частями этих баз. Движок событий, сообщения между подсистемами, очереди сообщений, таймеры, etc.

N>Собственно "вычислений" на уровне сложений-вычитаний-etc. там дай бог чтобы 1% (самое сложное — правила реавторизации — укладываются в полторы странички простого кода), ну ладно, с арифметикой указателей — 5%. Тем не менее работы — дофига и выше.
N>Хотите посмотреть, как оно помрёт под нагрузкой — задайте 100 новых звонков в секунду, треска будет на все окрестные сервера

Из вычислений я здесь вижу разбор входящих пакетов и ответов биллинга. Ну, база ж наверное не самописный софт. А что показывает профилер?

N>Если Вы всё это назовёте "вычислениями" — Вы просто некорректно подобрали термины, но если Вы всерьёз так думаете и игноруете то, что компьютеры в основном занимаются обработкой данных, а не вычислениями — то я вынужден просто посоветовать повторить высшее образование заново. Надеюсь, что это временно (пока жара не спадёт). Извините, ничего личного, но такое наплевательское игнорирование моей работы меня удивляет. И таки да, забирайте свой ENOSENSE обратно, знание жаргона не заменяет самостоятельное мышление.


Я не хотел обидеть, извините.
Re[10]: [Python] реализация мультипотокового TCP Server-а
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.06.10 21:32
Оценка:
Здравствуйте, Temoto, Вы писали:

N>>SIP softswitch. Разбираются входящие пакеты, строятся исходящие, посылаются запросы к биллингу, разбираются ответы. Ведётся база транзакций, база диалогов, база звонков, обмен с соседями частями этих баз. Движок событий, сообщения между подсистемами, очереди сообщений, таймеры, etc.

N>>Собственно "вычислений" на уровне сложений-вычитаний-etc. там дай бог чтобы 1% (самое сложное — правила реавторизации — укладываются в полторы странички простого кода), ну ладно, с арифметикой указателей — 5%. Тем не менее работы — дофига и выше.
N>>Хотите посмотреть, как оно помрёт под нагрузкой — задайте 100 новых звонков в секунду, треска будет на все окрестные сервера:)
T>Из вычислений я здесь вижу разбор входящих пакетов и ответов биллинга. Ну, база ж наверное не самописный софт. А что показывает профилер?

К сожалению, основные затраты — работа с SIP сообщениями (парсинг/разбор, сборка...) Из-за переусложнённости грамматики это выливается в большое количество копирований, модификаций... Существующие максимально эффективные реализации (типа SER и его клонов) делают это чуть ли не на ассемблере (специфический сишный код с заточкой на типичные разрядности вроде 32 бит).

T>Я не хотел обидеть, извините.


OK. Я тоже не то чтобы обиделся, но был крайне удивлён столь односторонним подходом.
The God is real, unless declared integer.
Re[11]: [Python] реализация мультипотокового TCP Server-а
От: Temoto  
Дата: 18.06.10 09:03
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Temoto, Вы писали:


N>>>SIP softswitch. Разбираются входящие пакеты, строятся исходящие, посылаются запросы к биллингу, разбираются ответы. Ведётся база транзакций, база диалогов, база звонков, обмен с соседями частями этих баз. Движок событий, сообщения между подсистемами, очереди сообщений, таймеры, etc.

N>>>Собственно "вычислений" на уровне сложений-вычитаний-etc. там дай бог чтобы 1% (самое сложное — правила реавторизации — укладываются в полторы странички простого кода), ну ладно, с арифметикой указателей — 5%. Тем не менее работы — дофига и выше.
N>>>Хотите посмотреть, как оно помрёт под нагрузкой — задайте 100 новых звонков в секунду, треска будет на все окрестные сервера
T>>Из вычислений я здесь вижу разбор входящих пакетов и ответов биллинга. Ну, база ж наверное не самописный софт. А что показывает профилер?

N>К сожалению, основные затраты — работа с SIP сообщениями (парсинг/разбор, сборка...) Из-за переусложнённости грамматики это выливается в большое количество копирований, модификаций... Существующие максимально эффективные реализации (типа SER и его клонов) делают это чуть ли не на ассемблере (специфический сишный код с заточкой на типичные разрядности вроде 32 бит).


Понятно.

А вы не рассматривали такой вариант: отдельный демон, например, на Haskell/Erlang/Go слушает SIP и парсит сообщения на всех ядрах, а потом отдаёт их вашему приложению в каком-то более простом формате ?
Re: [Python] реализация мультипотокового TCP Server-а
От: targeted Россия http://www.targeted.org/
Дата: 06.07.10 09:07
Оценка: 6 (2)
C0x>Имеет смысл для прокси сервиса с кучей клиентов?
C0x>PS: Я слышал, что в питоне потоки не совсем хорошо реализованы.

Потоки в питоне реализованы хорошо.

В зависимости от платформы используется доступный поточный механизм —
для Windows это стандартные win32 потоки, для Unix, для упрощения
скажем, pthreads. Одному потоку в питоне соответствует один
платформенный поток. Так что все оптимально, лучше не сделать,
только усложнять.

Проблема в том, что потоки, одновременно выполняющие код виртуальной
машины Python, вынуждены часто втыкаться в синхронизацию
на пресловутой GIL. Поэтому многопоточное приложение на питоне,
выполняющее интенсивные вычисления (т.е. код вирт. машины), может
оказаться малоэффективным.

При активной работе с TCP все немного не так. Всякий раз, когда
вызывается TCP стек (ядро, и вообще, все что угодно "вне" питона),
поток заявляет, что он временно покидает зону GIL и уходит в вызов.
Примерно так:

int py_Send(...)
{
Py_BEGIN_ALLOW_THREADS
tcp.send(...)
Py_END_ALLOW_THREADS
}

между BEGIN и END поток свободен, им управляет только платформенный
шедулер и чихать он хотел на GIL.

Грубо говоря — внутри питона одновременно выполняется только один
поток, а вне — сколько угодно.

Так что многопоточное приложение на питоне, которое выполняет много
I/O, страдает меньше, чем то, которое выполняет много CPU.
Понятное дело, проблем при обработке полученных данных _внутри_
питона, это не снимает, так что увлекаться большим количеством
потоков в Python не стоит. YMMV.

Вот здесь у меня (в том числе) есть многопоточный TCP сервер,
в котором один поток принимает входящие соединения, накапливает
их, и опрашивает select-ом, готовые соединения читает/пишет,
после чего данные отдает в работу пулу рабочих потоков,
можете полюбопытствовать:

http://www.pythomnic3k.org/
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.