2012-05-24 4 views
2

Я работаю над веб-сервером, который часто захватывает данные рынка в реальном времени из Интернета и помещает данные в базу данных MySQL.Python несколько процессов вместо потоков?

В настоящее время у меня есть мой основной поток push задач в объект Queue. Затем у меня около 20 потоков, которые читаются из этой очереди, и если задача доступна, они ее выполняют.

К сожалению, я сталкиваюсь с проблемами производительности, и, проведя много исследований, я не могу решить.

Как я вижу, у меня есть 3 варианта: Должен ли я использовать распределенный подход к задачам с чем-то вроде Celery? Должен ли я переключиться на JPython или IronPython, чтобы избежать проблем с GIL? Или нужно просто создавать разные процессы вместо потоков, используя обработку? Если я поеду за последним, сколько процессов - хорошая сумма? Что представляет собой хороший многопроцессорный производитель/потребительский дизайн?

Спасибо!

+0

Вы окончательно определили, где ваши узкие места? –

ответ

1

Может быть, вы должны использовать event-driven подход, и использовать управляемые событиями ориентированных структур, как twisted (Python) или node.js (JavaScript), например, это основы использовать сокеты домена UNIX, так что ваш потребитель слушает в какой-то порт , и ваш объект генератора событий передает всю информацию потребителю, поэтому вашему потребителю не нужно каждый раз проверять, есть ли что-то в очереди.

+0

спасибо - я определенно считался скрученным раньше, но я просто не видите, как это будет работать - что именно получат потребители и как? – user1094786

1

Прежде всего, укажите свой код, чтобы определить, что является узким местом в вашей производительности.

Если каждый из ваших потоков часто записывается в вашу базу данных MySQL, проблема может быть дисковым вводом/выводом, и в этом случае вам следует использовать базу данных в памяти и периодически записывать ее на диск.

Если вы обнаружите, что производительность ЦП является ограничивающим фактором, рассмотрите возможность использования модуля multiprocessing вместо модуля threading. Используйте объект multiprocessing.Queue, чтобы выполнить ваши задачи. Также убедитесь, что ваши задачи достаточно велики, чтобы какое-то время ядро ​​занималось, так что гранулярность связи не убивает производительность. Если вы используете threading, то переход на multiprocessing будет самым простым способом продвижения вперед.

+0

, честно говоря, я не уверен, как проверить, как мой процесс python использует свои ресурсы с точки зрения ввода-вывода диска и так далее. Каждые минуты у меня около 200 000-30 000 вставок. это много? средняя длина строки составляет около 60-70 байт ... – user1094786

+0

Отказ от ответственности: материал базы данных не является моей силой. Тем не менее, предполагая, что 30 тыс. Вставок составляет 70 Б в минуту, вы пишете всего около 2 МБ в минуту, поэтому пропускная способность диска, скорее всего, не проблема. Однако, если каждая вставка является одной дисковой транзакцией, то задержка поиска диска может определенно быть узким местом. Есть ли способ сделать ваши вставки базы данных в виде пакета? Вы должны просмотреть свой код, чтобы узнать, какие операции занимают самые длинные. Взгляните на этот ответ за помощью: http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script –

Смежные вопросы