Понимание python GIL — привязка ввода-вывода по сравнению с привязкой к процессору

Из документации по потокам python.

В CPython из-за глобальной блокировки интерпретатора только один поток может одновременно выполнять код Python (даже несмотря на то, что некоторые библиотеки, ориентированные на производительность, могут обойти это ограничение). Если вы хотите, чтобы ваше приложение лучше использовало вычислительные ресурсы многоядерных машин, рекомендуется использовать многопроцессорность. Однако многопоточность по-прежнему является подходящей моделью, если вы хотите одновременно выполнять несколько задач, связанных с вводом-выводом.

Теперь у меня есть такой рабочий поток

def worker(queue):
    queue_full = True
    while queue_full:
        try:
            url = queue.get(False)
            w = Wappalyzer(url)
            w.analyze()
            queue.task_done()

        except Queue.Empty:
            queue_full = False

Здесь w.analyze() делают две вещи

  1. Очистите URL-адрес, используя библиотеку requests
  2. Анализ очищенного html с помощью библиотеки pyv8 javascript

Насколько я знаю, 1 привязан к вводу-выводу, а 2 привязан к процессору.

Означает ли это, что GIL подал заявку на 2 и моя программа не будет работать должным образом?


person PrivateUser    schedule 09.05.2014    source источник
comment
Я бы проверил предположение здесь. Я думаю, что requests привязан к ЦП или, по крайней мере, блокирует свой поток до тех пор, пока запрос не завершится. Для библиотеки с поддержкой обратного вызова я бы проверил requests-futures.   -  person huu    schedule 10.05.2014
comment
Это неправильно. requestsurllib, httplib2 и т. д.) очень сильно связаны с вводом-выводом. threading ускоряет их всех.   -  person roippi    schedule 10.05.2014
comment
@Huu То, что что-то блокирует поток, не означает, что он привязан к процессору. Если вы поместите sleep(1000) в поток, поток будет заблокирован на некоторое время, но он не будет выполнять никакой работы и освободит GIL между ними. То же самое касается любого другого типа запроса ввода-вывода.   -  person Voo    schedule 10.05.2014


Ответы (1)


В GIL описании ничего не сказано о правильности, только об эффективности.

Если 2 привязан к ЦП, вы не сможете получить многоядерную производительность за счет многопоточности, но ваша программа все равно будет работать правильно.

Если вам важен параллелизм ЦП, вам следует использовать библиотеку Python multiprocessing.

person merlin2011    schedule 09.05.2014