Встречается на собеседованиях • сегодня

Как сделать параллельное исполнение потоков при наличии GIL в Python

В Python GIL (Global Interpreter Lock) ограничивает параллельное выполнение потоков для CPU-задач, но можно использовать несколько подходов для обхода этого ограничения:

  1. Мультипроцессинг (модуль multiprocessing):
    python
    from multiprocessing import Pool
    
    def task(x):
        return x * x
    
    if __name__ == '__main__':
        with Pool(4) as p:
            print(p.map(task, [1, 2, 3, 4]))
    Каждый процесс имеет свой GIL, что позволяет использовать несколько ядер CPU.
  1. Асинхронность (модуль asyncio):

    python
    import asyncio
    
    async def task():
        await asyncio.sleep(1)
        print("Done")
    
    async def main():
        await asyncio.gather(task(), task(), task())
    
    asyncio.run(main())

    Подходит для I/O-bound задач, но не для CPU-bound.

  2. C-расширения (например, numpy, Cython):
    Выносят CPU-задачи в код без GIL.

  3. Потоки для I/O-bound задач (модуль threading):

    python
    import threading
    
    def task():
        print("Running in thread")
    
    threads = [threading.Thread(target=task) for _ in range(4)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()

    Потоки полезны при ожидании I/O, так как GIL отпускается во время блокирующих операций.

Выбор метода зависит от типа задачи (CPU-bound или I/O-bound).

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы