Может ли Python декодировать JSON в параллельных потоках?

В мире API кажется, что многие приложения Python тратят больше времени на декодирование JSON, чем что-либо еще.

Однако кажется, что все декодеры JSON блокируют GIL во время декодирования, а это означает, что невозможно ускорить декодирование JSON с помощью многопоточности или вообще любых других средств. Множественная обработка может работать в некоторых случаях использования, когда декодированный json не нужно напрямую агрегировать (например, каждый процесс может декодировать и суммировать или иным образом обрабатывать, прежде чем возвращать гораздо меньший результат).

Мне было любопытно, есть ли какая-либо техническая причина, по которой нельзя было бы написать потокобезопасный декодер JSON, который либо декодирует JSON на нескольких ядрах внутри, либо каким-то образом освобождает GIL, позволяя выполнять несколько вызовов.

Если декодер в основном просто создает новые объекты, на которые не может ссылаться ничто за пределами декодированного дерева объектов (пока), нужен ли GIL? К каким другим частям интерпретатора необходимо получить доступ таким образом, чтобы потребовался GIL? Это что-то вроде общих пулов строк? Являются ли все эти проблемы непреодолимыми для этого конкретного варианта использования?


person aaa90210    schedule 07.12.2020    source источник


Ответы (1)


В двух словах, это невозможно, потому что само управление памятью в Python не потокобезопасный, а также операции выделения, перераспределения, освобождения памяти и другие требовать получения GIL.

person alex_noname    schedule 07.12.2020
comment
Конечно. Но может ли декодер захватить большой кусок памяти, удерживая GIL, а затем, освобождая GIL, использовать эту память только для построения дерева объектов? Я не исключаю небольшой предварительной и последующей работы во время проведения GIL. - person aaa90210; 07.12.2020
comment
Частично с вами согласен, такой подход возможно можно реализовать через расширение C для работы с json, но я не встречал такой реализации позволяющей многопоточность. Хотя такие предложения периодически возникают. - person alex_noname; 08.12.2020
comment
Спасибо, похоже, у кого-то есть точно такая же идея! - person aaa90210; 08.12.2020