Мы знаем, что python имеет глобальную блокировку интерпретатора, которая может вызвать много конфликтов между потоками, если мы используем бэкэнд потоковой обработки в задаче Parallel () в Joblib. Однако предположим, что я создал сценарий Cython:
cdef map[string, int] very_large_map
cdef map[string, int] load_data():
# Some data cleaning...
return very_large_map
def heavy_task(many_lines):
for line in many_lines:
with nogil:
# Heavy tasks on [line]...
# only read from [very_large_map]
return results
def central(total_lines):
global very_large_map
very_large_map = load_data()
all_results = Parallel(n_cpu, require="sharedmem")(delayed(
total_lines[(i * batch_size):((i + 1) * batch_size)]
))
Я собираюсь поделиться файлом very_large_map с разными процессами / потоками, чтобы он не копировался много раз в память. Между тем, поскольку я читаю из very_large_map только после того, как он загружен, я выпускаю GIL, используя "with nogil", надеясь, что потоки могут читать из very_large_map одновременно без каких-либо конфликтов. Однако оказывается, что сценарий все еще очень медленный, и кажется, что GIL на самом деле не выпущен.
Кто-нибудь может сказать мне, что происходит за «with nogil» и «sharedmem»? Если GIL действительно не выпущен, то как я могу добиться одновременного чтения файла very_large_map без необходимости разветвлять его на разные процессы / потоки?
Спасибо!