Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 240

$ python2 gevent_test.py

66.6.44.4

74.125.142.121

78.136.12.50

Функция gevent.spawn() создает зеленый поток (его также иногда называют

микропотоком) для выполнения каждого вызова gevent.socket.gethostbyname(url).

Разница между ним и обычным потоком заключается в том, что зеленый поток

не блокируется. Если произошло какое-то событие, которое заблокировало бы

обычный поток, gevent переключит управление на другой зеленый поток.

Метод gevent.joinall() ожидает завершения всех созданных задач. Наконец, мы

выводим на экран IP-адреса, полученные для заданных имен хостов.

Вместо класса socket модуля gevent вы можете использовать его функции для

monkey-patching (обезьяний патч). Они модифицируют стандартные модули вро-

де socket так, чтобы они использовали зеленые потоки вместо того, чтобы каждый

310

Глава 11. Конкуренция и сети

раз вызывать версию модуля gevent. Это полезно, если вы хотите использовать

gevent везде, даже в коде, к которому вы можете не иметь доступа.

Добавьте в начало программы следующий вызов:

from gevent import monkey

monkey.patch_socket()

Это заменит все обычные сокеты на сокеты gevent даже в стандартной библиотеке.

Но это работает только для кода Python, но не для библиотек, написанных на С.

Еще одна функция выполняет такой патчинг для еще большего количества

модулей стандартной библиотеки:

from gevent import monkey

monkey.patch_all()

Разместите этот код в начале программы, чтобы максимально воспользоваться

ускорением, обеспечиваемым gevent.

Сохраните программу под именем gevent_monkey.py:

import gevent

from gevent import monkey; monkey.patch_all()

import socket

hosts = ['www.crappytaxidermy.com', 'www.walterpottertaxidermy.com',

'www.antique-taxidermy.com']

jobs = [gevent.spawn(socket.gethostbyname, host) for host in hosts]

gevent.joinall(jobs, timeout=5)

for job in jobs:

print(job.value)

Запустите программу с помощью Python 2:

$ python2 gevent_monkey.py

66.6.44.4

74.125.192.121

78.136.12.50

Использование gevent может нести потенциальную опасность. Как и в случае

с любой другой системой, основанной на событиях, каждый исполняемый вами

фрагмент кода должен быть относительно быстрым. Несмотря на то что код, кото-

рый выполняет много работы, не блокируется, он будет работать медленно.

Сама идея monkey-patching заставляет нервничать некоторых людей. Несмотря

на это, многие крупные сайты вроде Pinterest используют gevent для значительно-