Общая память Joblib с nogil - PullRequest
1 голос
/ 12 июля 2020

Мы знаем, что 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 без необходимости разветвлять его на разные процессы / потоки?

Спасибо!

...