Подтвердить что ты не робот

Многоквартирное использование Gevent

Я только что начал с python gevent, и мне было интересно узнать об использовании библиотеки cpu/mulitcore.

Попробовав несколько примеров, выполняющих множество запросов через monkeypatched urllib, я заметил, что они работают только на одном ядре, используя нагрузку 99%.

Как я могу использовать все ядра с gevent с помощью python? Есть ли лучшая практика? Или есть побочные эффекты с использованием нескольких процессов и gentent?

BR дан

4b9b3361

Ответ 1

Gevent дает вам возможность обрабатывать запросы блокировки. Это не дает вам возможность работать на многоядерных процессорах.

В любой момент в процессе python работает только одна зеленая (gevent coroutine). Реальная польза от gevent заключается в том, что он очень эффективен, когда он имеет дело с узкими местами ввода-вывода (что обычно имеет место для общих веб-приложений, веб-приложений, обслуживающих конечные точки API, веб-чат-приложений или бэкэнд и, в общем, сетевых приложений). Когда мы выполняем некоторые вычисления с процессором, от использования gevent не будет выигрыша от производительности. Когда приложение связано с I/O, gevent является чистой магией.

Существует одно простое правило: Greenlets отключается всякий раз, когда операция ввода-вывода блокируется или когда вы выполняете явно (например, с gevent.sleep())

Встроенные потоки python фактически ведут себя одинаково (псевдо) "одновременно" как gevent greenlets.

Ключевое различие заключается в том, что - зелья используют кооперативную многозадачность, где потоки используют превентивную многозадачность. Это означает, что зелень никогда не перестанет исполнять и "уступать" другой зелени, если только она не использует определенные "уступающие" функции (например, gevent.socket.socket.recv или gevent.sleep).

С другой стороны, потоки будут работать с другими потоками (иногда непредсказуемо) на основе того, когда операционная система решит их заменить.

И, наконец, для использования многоядерного ядра в Python - если это вам нужно - мы должны зависеть от модуля многопроцессорности (который является встроенным модулем в Python). Это "обходит GIL". Другие альтернативы включают использование Jython или выполнение задач параллельно (на разных ЦП) с использованием очереди задач, например. ZeroMQ.

Я написал очень длинное объяснение здесь - http://learn-gevent-socketio.readthedocs.org/en/latest/. Если вы хотите погрузиться в детали.:-D