Как я могу улучшить производительность моей многопоточной программы на Python? - PullRequest
0 голосов
/ 01 июня 2018

Я делаю программу на python, которая периодически (с интервалом в 1 секунду) собирает некоторые данные из ~ 700 файлов и запрашивает сервер с полученными данными.Для одного запроса время ответа обычно составляет 2-3 мсек, но в некоторых случаях это может занять до 200 мсек.Программа состоит из:

  1. Один извлекающий поток: каждую 1 секунду перебирает более 700 файлов, получает данные, а затем отправляет полученные данные в общую очередь так называемого пула запросов.

  2. Пул из N потоков: каждый поток выбирает данные из общей очереди и отправляет запрос на сервер.

Если N равно 4, программа показывает лучшееспектакль.Если я увеличу N до 8, тогда производительность значительно ухудшится.Я предполагаю, что это из-за GIL Python.

Большую часть времени программа работает хорошо, но если есть запрос, который занимает много времени (из-за позднего ответа от сервера), то на все последующие запросы сильно влияют.

Я действительно хочу воспользоваться многопоточностью, поэтому я смотрю на gevent, но не уверен, может ли это помочь.

Мои вопросы:

  1. Как выглядит мой текущий дизайн?Есть ли лучший дизайн для него?

  2. Поможет ли gevent в этой проблеме?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вам следует рассмотреть возможность использования GIPC https://gehrcke.de/gipc/ как способа избежать GIL и использовать преимущества нескольких процессоров, но при этом все еще сохранять перекрестную связь.

0 голосов
/ 01 июня 2018

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

Если я правильно понимаю, каждую 1 секунду ваш извлекающий поток добавляет 700 задач в очередь, а затем каждый рабочий поток просто выполняет одну из этих задач и отправляет запросудаленный сервер.Я прав?

В этом случае сеть вызывает замедление?Не могли бы вы подтвердить это?Если вы думаете, что GIL приводит к снижению производительности при использовании большего количества потоков, означает ли это, что в вашей программе есть некоторые узкие места в вычислениях?

И затем, для вашего второго вопроса, gevent очень вам поможет, еслизамедление вызвано сетью.

...