У меня есть приложение фляги, которое позволяет вам создавать запросы для базы данных. Люди будут искать что-то на десятках тысяч столов. Какие таблицы запрашиваются, варьируется. Следовательно приложение колбы в качестве внешнего интерфейса сборщика.
Основные запросы разбиты на запросы. Структура подзапроса выглядит так: «выберите 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
. Что мне не хватает?