Есть скрипт разбирающий XML и записывающий результаты в БД. XML файлов много. Я решил поднять скорость обработки и стал создавать по 10 потоков для обработки, но когда сравнил с однопоточной версией, то оказалось что разницы практически никакой нет.
Почитал документацию. Я правильно понимаю что из-за GIL приложение на Питоне не может больше одного ядра использовать? Сейчас эту проблему можно как-то обойти?
Решение в лоб - использовать мультипроцессинг. Разумный подход - это проанализировать ваш код, найти в нём узкие места и определить их тип. Я серьёзно сомневаюсь, что разбор XML и запись данных в базу - это CPU-bound задача, ускорение которой возможно через использование дополнительных ядер.
Pavel Denisov, разбор XML — вполне себе CPU-bound, только вот 100 тысяч XMLей распарсить — дело пары минут. Писать код для распараллеливания этого дольше.
Pavel Denisov, у меня в SQLite только файлы для обработки писались. Там вопрос был в том, как строки из БД забирать из нескольких потоков одновременно. Проблему я решил используя lock. Скорости от этого я не ждал, просто было не понятно как из нескольких потоков долбиться.
В Sqlite надо делать все инсерты в одной транзакции иначе будет тормозить. Ещё можно сделать PRAGMA synchronous=OFF https://www.sqlite.org/faq.html#q19
Из основого приложения читайте строки из sqlite и отдавайте процессам-воркерам на обработку, напр. используя multiprocessing.
Из sqlite читайте строки пачками, чтобы реже к ней обращаться.