выбор программы на питоне - PullRequest
0 голосов
/ 12 июля 2009

Моя программа - ICAPServer (аналогично httpserver), ее основная задача - получать данные от клиентов и сохранять их в БД.

Существует два основных шага и две темы:

  1. ICAPServer получает данные от клиентов, помещает их в очередь (50 КБ <1 мс); </li>
  2. другой поток извлекает данные из очереди и записывает их в БД SO, если 2-й шаг слишком медленный, очередь заполнит память этими данными.

Интересно, есть ли у кого-нибудь предложение ...

Ответы [ 3 ]

2 голосов
/ 12 июля 2009

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

Наличие системы, разработанной на основе процессов, может иметь следующие преимущества:

  • Более высокий параллелизм, особенно на многопроцессорных машинах
  • Большая пропускная способность, так как вы можете, вероятно, порождать несколько потребителей очереди / процессов записи в БД для распределения работы. Хотя, влияние этого может быть минимальным, если узким местом является именно БД, а не процесс записи в БД.
0 голосов
/ 12 июля 2009

Одно замечание: прежде чем идти на оптимизацию, очень важно получить хорошее измерение и профилирование.

Тем не менее, я бы поспорил, что медленная часть на втором этапе - это связь с базой данных; Вы можете попытаться проанализировать оператор SQL и план его выполнения. а затем оптимизировать его (это одна из функций SQLAlchemy); если все равно это будет слишком медленно, проверьте оптимизацию базы данных.

Конечно, возможно, узкое место окажется в совершенно другом месте; в этом случае у вас все еще есть шансы оптимизировать с использованием кода C, выделенной сети или нескольких потоков - просто чтобы привести три возможных примера совершенно разных видов оптимизации.

Еще один момент: поскольку операции ввода-вывода обычно освобождают GIL, вы также можете попытаться улучшить производительность, просто добавив еще один поток для чтения - и я думаю, что это может быть гораздо более дешевым решением.

0 голосов
/ 12 июля 2009

Установить верхний предел количества данных в очереди?

...