идентичные запросы к базе данных с помощью приложения-колбы в Windows занимают в 10 раз больше времени: _winapi.WaitForSingleObject - виновник - PullRequest
0 голосов
/ 10 июня 2019

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

Основные запросы разбиты на запросы. Структура подзапроса выглядит так: «выберите x из y». у выбирается из списка таблиц. Поскольку список длинный и каждый поиск может быть медленным, список разбивается на куски, а запросы выполняются параллельно через модуль multiprocessing. Каждый поток проходит через свой подсписок: SELECT x FROM y1, ...FROM y2, ...FROM y3... Когда все подзапросы выполнены, у вас есть свой результат.

Код отлично работает на macOS, BSDs и Linux. Я совсем не заинтересован в том, чтобы реорганизовать основную логику приложения, поскольку для этого потребуется перекодировать множество функций, чтобы приспособиться к одной платформе.

Профилировщик колб говорит, что из 3.8s, использованного для поиска, большая часть была потрачена на ожидание postgres:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    29    3.162    0.109    3.162    0.109 {built-in method posix.waitpid}​

Это имеет смысл. Это очень приемлемая характеристика, учитывая относительные размеры иголки и стога сена.

Тот же поиск в Windows10 занимает 43.9 секунд. Профилировщик колб отображает совсем другой список «самых дорогих» вызовов функций:

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)​
    7   41.082    5.869   41.082    5.869 {built-in method _winapi.WaitForSingleObject}​
   40    1.098    0.027    1.100    0.027 {method 'dump' of '_pickle.Pickler' objects}​
   48    0.466    0.010    0.466    0.010 {built-in method _winapi.WaitForMultipleObjects}​
   30    0.239    0.008    0.241    0.008 {method 'execute' of 'psycopg2.extensions.cursor' objects}​

Я не знаю, почему я плачу этот невероятно высокий налог до _winapi.WaitForSingleObject. Но похоже, что есть некоторая основная проблема с тем, как multiprocessing реализован на разных платформах.

Я ищу совет / руководство о том, как вызвать multiprocessing на Windows10 без взимания этого налога. Люди должны все время обрабатывать на w10, не имея дело с _winapi.WaitForSingleObject. Что мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...