Работа со значениями Гринлета
Я хотел бы внедрить асинхронную работу в одну из моих функций тестирования. Функция, эвристически, выглядит следующим образом -
def test_sessions(self):
sessions = []
"""
Creating 10k session instances
"""
for i in xrange(10000):
sessions.append(Session.create_session(session_handle, login_params(user, pass))
"""
Foreach session instance, check session validity by running read_dir command
"""
for session in sessions:
connection = Connection.create_connection(addrs, port)
connection.session = session.id
response = connection.read_dir(dir)
"""
Deleting the 10k opened sessions
"""
for session in sessions:
session.delete(session_handle)
Время, необходимое для выполнения этой проверки для сеансов 10k, составляет около 30 метров. Следовательно, я хотел использовать greenlet и gevent для этих разделов (создать, проверить и удалить), чтобы немного ускорить процесс.
У меня возникли некоторые проблемы с пониманием того, как реализовать эту идею, так как я не мог понять, как получить доступ к экземплярам сеанса, которые будут созданы зелеными потоками. Я не смог найти хорошего примера того, как можно использовать Гринлет значения.
Пожалуйста, направьте меня к правильному способу использования гринлета здесь
1 ответ
Поместите код для одного сеанса в одну функцию, примерно так:
def check_session()
session = Session.create_session(session_handle, login_params(user, pass)
connection = Connection.create_connection(addrs, port)
connection.session = session.id
response = connection.read_dir(dir)
session.delete(session_handle)
Теперь вы должны импортировать greenlet, monkey-patch all, а затем создавать задачи, используя tasks = [ Greenlet.spawn(check_session) для i в диапазоне (10000) ] для задачи в задачах: task.run()
Все задачи будут запущены. Обратите внимание, что гринлеты не работают параллельно - они блокируются только на входе / выходе, например, на сетевых сокетах, после чего другой начинает работать. Если большая часть вашего времени уходит на ожидание сети, они должны значительно ускорить процесс. Если нет, то нет.
Также будьте осторожны, если вы используете какой-то очень специфический или нестандартный код для доступа к сети. monkey.patch_all()
заменяет код сокета Python (и дисковый ввод-вывод и т. д.) на версию Gevent, которая вместо ожидания возвращает другой гринлет. Если ваш код не использует socket
, он не может быть исправлен, и он будет работать последовательно, как обычно.