Lock
example - graceful shutdownΒΆ
Graceful shutdown, an example use case for Lock
.
poll
continuously fetches http://tornadoweb.org, and after 5 seconds,
shutdown
stops the IOLoop. We want any request that poll
has begun to
complete before the loop stops, so poll
acquires the lock before starting
each HTTP request and releases it when the request completes. shutdown
also
acquires the lock before stopping the IOLoop.
(Inspired by a post to the Tornado mailing list.)
import datetime
from tornado import ioloop, gen, httpclient
import toro
lock = toro.Lock()
loop = ioloop.IOLoop.current()
@gen.coroutine
def poll():
client = httpclient.AsyncHTTPClient()
while True:
with (yield lock.acquire()):
print 'Starting request'
response = yield client.fetch('http://www.tornadoweb.org/')
print response.code
# Wait a tenth of a second before next request
yield gen.Task(loop.add_timeout, datetime.timedelta(seconds=0.1))
@gen.coroutine
def shutdown():
# Get the lock: this ensures poll() isn't in a request when we stop the
# loop
print 'shutdown() is acquiring the lock'
yield lock.acquire()
loop.stop()
print 'Loop stopped.'
if __name__ == '__main__':
# Start polling
poll()
# Arrange to shutdown cleanly 5 seconds from now
loop.add_timeout(datetime.timedelta(seconds=5), shutdown)
loop.start()