Я сделал запрос для вас. Это даст вам рекурсивную категорию с одним запросом:
SELECT id,NAME,'' AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 WHERE prent is NULL
UNION
SELECT b.id,a.name,b.name AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id WHERE a.prent is NULL AND b.name IS NOT NULL
UNION
SELECT c.id,a.name,b.name AS subName,c.name AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id WHERE a.prent is NULL AND c.name IS NOT NULL
UNION
SELECT d.id,a.name,b.name AS subName,c.name AS subsubName,d.name AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id LEFT JOIN Table1 AS d ON d.prent=c.id WHERE a.prent is NULL AND d.name IS NOT NULL
ORDER BY NAME,subName,subsubName,subsubsubName
Ваша задача больше связана с процессором, чем с операциями ввода-вывода. Асинхронное выполнение имеет смысл, когда у вас длинные операции ввода-вывода, т.е. отправка / получение чего-либо из сети и т. Д.
То, что вы можете сделать, это разделить задачу на куски и использовать потоки и многопроцессорность (работать на разных ядрах процессора).
Это просто общий ответ, но слишком длинный для комментария ...
Прежде всего, я думаю, что вашим самым большим узким местом в данный момент является сам Python. Я не знаю, что делает do_work()
, но если он интенсивно использует процессор, у вас есть GIL, который полностью предотвращает эффективное распараллеливание внутри одного процесса. Независимо от того, что вы делаете, потоки будут бороться за GIL, и это в конечном итоге сделает ваш код еще медленнее. Помните: Python имеет реальную многопоточность, но центральный процессор совместно используется внутри одного процесса. Я рекомендую проверить страницу Дэвида М Бизли: http://dabeaz.com/GIL/gilvis , который приложил много усилий для визуализации поведения GIL в Python.
С другой стороны, модуль multiprocessing
позволяет запускать несколько процессов и «обходить» недостатки GIL, но будет сложно получить доступ к тем же ячейкам памяти без больших штрафов или компромиссов. [1110 ]
Второе: если вы используете тяжелые вложенные циклы, вам следует подумать об использовании numba
и попытках разместить ваши структуры данных внутри numpy
(структурированных) массивов. Это может дать вам порядок скорости довольно легко. Python слишком медленный для таких вещей, но, к счастью, есть способы выжать лот при использовании соответствующих библиотек.
Подводя итог, я думаю, что код, который вы запускаете, может быть на несколько порядков быстрее со структурами numba
и numpy
.
В качестве альтернативы, вы можете попробовать переписать код на языке, подобном Julia
(синтаксис, очень похожий на Python и сообщество, чрезвычайно полезен) и быстро проверить, насколько быстро он работает, чтобы изучить ограничения производительности. Всегда полезно почувствовать, насколько быстро что-то (или части кода) может быть в языке, который не имеет таких сложных критических аспектов производительности, как Python.