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 для значительно-