Я пишу многопоточный декомпрессор на python. Каждому потоку требуется доступ к разному фрагменту входного файла.
Примечание 1: невозможно загрузить файл целиком, так как он составляет от 15 до 200 ГБ; Я использую не многопоточность для ускорения чтения данных, а декомпрессию данных, я просто хочу убедиться, что чтение данных не замедляет декомпрессию.
Примечание 2: GIL здесь не проблема, поскольку основная функция декомпрессора является расширением C и вызывает Py_ALLOW_THREADS, так что GIL освобождается при распаковке. На втором этапе декомпрессии используется numpy, который также не содержит GIL.
1) Я предполагал, что просто не сработает просто разделить объект Decompressor (который, по сути, является оболочкой для файлового объекта), поскольку, если поток A вызывает следующее:
decompressor.seek(x)
decompressor.read(1024)
и поток B делает то же самое, поток A может закончить чтение от смещения резьбы B. Это правильно?
2) Прямо сейчас я просто заставляю каждый поток создавать свой собственный экземпляр Decompressor, и кажется, что это работает, но я не уверен, что это лучший подход. Я рассмотрел эти возможности:
Добавьте что-нибудь вроде
seekandread (from_where, length)
классу Decompressor, который получает блокировку, ищет, считывает и снимает блокировку;
Создает поток, который ожидает запросов на чтение и выполняет их в правильном порядке.
Итак, я упускаю очевидное решение? Есть ли значительная разница в производительности между этими методами?
Спасибо