Обхід GIL

Global Interpreter Lock (GIL) — це механізм в інтерпретаторі CPython, який забезпечує, що тільки один потік виконує байт-код Python в будь-який момент часу.

Використання багатопроцесорності (multiprocessing)

Модуль multiprocessing дозволяє створювати процеси, які виконуються паралельно і не обмежені GIL, так як кожен процес має свій власний інтерпретатор Python і пам'ять.

import multiprocessing

def worker(num):
    print(f'Worker: {num}')

def main():
    processes = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

main()

Асинхронне програмування

import asyncio

async def main():
    await asyncio.sleep(1)
    print('Hello')

asyncio.run(main())

Використання бібліотек з власним управлінням потоками

Деякі бібліотеки, такі як NumPy і SciPy, написані на C і використовують власні механізми управління потоками, що дозволяє їм обходити GIL і ефективно використовувати багатоядерні процесори для обчислень.

Виконання обчислень поза інтерпретатором Python

Використання розширень на C/C++ або інших мовах, які можуть виконувати обчислення поза інтерпретатором Python і потім повертати результат. Це дозволяє уникнути блокування GIL на час виконання інтенсивних обчислень.

Приклад використання Cython:

# example.pyx

def compute(int n):
    cdef int i, result = 0
    for i in range(n):
        result += i
    return result

Компіляція і використання:

cythonize -i example.pyx

import example
print(example.compute(1000000))

 

2015-2026 © SumyNikNet