2015-11-12 3 views
2

Я хочу отправить два асинхронных запроса, используя grequests.send с короткой, но точной задержкой (скажем, 20 мс) между ними. Я хочу обработать ответы только после отправки обоих запросов.Можно ли спать без урока?

Помещение time.sleep между двумя отправками не работает, потому что sleep дает обработчик ответа для запроса 1 до отправки запроса 2, поэтому запрос 2 отправляется с опозданием.

grequests.send(req1, grequests.Pool(1)) 
time.sleep(delay) 
grequests.send(req2, grequests.Pool(1)) # Request is sent late 

Как я могу обеспечить весь блок выше выполняемый атомарна, чтобы обеспечить как можно ближе к ожидаемому времени ожидания между запросами, без напряженного ожидания?

+0

Я не думаю, что попытка приостановить процесс для _exact_ количества времени на многозадачной ОС выполнима; ваш процесс находится во власти планировщика ОС, который может возобновить ваш процесс позже запрошенного времени ожидания. –

+0

@ColonelThirtyTwo True. Я предполагаю, что я имею в виду «как можно точнее». Я могу терпеть это, если ошибаюсь через несколько мс. – akxlr

+0

Вы можете сделать «занятый цикл ожидания» и наблюдать часы до тех пор, пока не пройдет сколько-нибудь времени. – martineau

ответ

0

Самый элегантный способ сделать это - не время патча обезьяны. Так что это:

from gevent import monkey 
monkey.patch_all(time=False) 

Затем, когда вы используете time.sleep он не будет уступать.

Если вы используете gevent.sleep, он все равно будет спать и уступать, если вам нужна эта функциональность.

Помните, что если вы используете другие библиотеки, которые используют time.sleep, они не будут работать в этой точке. Но это редко, поэтому не должно быть проблемой.