Из документации по потокам 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()
делают две вещи
- Очистите URL-адрес, используя библиотеку
requests
- Анализ очищенного html с помощью библиотеки
pyv8
javascript
Насколько я знаю, 1
привязан к вводу-выводу, а 2
привязан к процессору.
Означает ли это, что GIL подал заявку на 2
и моя программа не будет работать должным образом?
requests
привязан к ЦП или, по крайней мере, блокирует свой поток до тех пор, пока запрос не завершится. Для библиотеки с поддержкой обратного вызова я бы проверил requests-futures. - person huu   schedule 10.05.2014requests
(иurllib
,httplib2
и т. д.) очень сильно связаны с вводом-выводом.threading
ускоряет их всех. - person roippi   schedule 10.05.2014sleep(1000)
в поток, поток будет заблокирован на некоторое время, но он не будет выполнять никакой работы и освободит GIL между ними. То же самое касается любого другого типа запроса ввода-вывода. - person Voo   schedule 10.05.2014