Package restkit :: Package ext :: Module eventlet_pool
[hide private]
[frames] | no frames]

Source Code for Module restkit.ext.eventlet_pool

  1  # -*- coding: utf-8 - 
  2  # 
  3  # This file is part of restkit released under the MIT license.  
  4  # See the NOTICE for more information. 
  5   
  6  from __future__ import with_statement 
  7   
  8  import eventlet 
  9  from eventlet import queue 
 10  from eventlet.timeout import Timeout 
 11   
 12  from restkit.pool import PoolInterface 
 13  from restkit import sock 
 14   
15 -class EventletPool(PoolInterface):
16 """ 17 Eventlet pool to manage connections. after a specific timeout the 18 sockets are closes. Default timeout is 300s. 19 20 To use restkit with eventlet:: 21 22 import eventlet 23 eventlet.monkey_patch(all=False, socket=True, select=True) 24 from restkit import request 25 from restkit.ext.eventlet_pool import EventletPool 26 pool = EventletPool() 27 r = request('http://openbsd.org', pool_instance=pool) 28 """ 29
30 - def __init__(self, max_connections=4, timeout=300):
31 """ Initialize EventletPool 32 33 :param max_connexions: int, number max of connections in the pool. 34 Default is 4 35 :param timeout: int, number max of second a connection is kept alive. 36 Default is 300s. 37 """ 38 self.max_connections = max_connections 39 self.timeout = 60 40 self.hosts = {} 41 self.sockets = {}
42
43 - def get(self, address):
44 """ Get connection for (Host, Port) address 45 :param address: tuple (Host, address) 46 """ 47 connections = self.hosts.get(address) 48 if hasattr(connections, 'get'): 49 try: 50 socket = connections.get(False) 51 self.hosts[address] = connections 52 del self.sockets[socket.fileno()] 53 return socket 54 except queue.Empty: 55 pass 56 return None
57
58 - def monitor_socket(self, fn):
59 """ function used to monitor the socket """ 60 with Timeout(self.timeout, False): 61 if fn in self.sockets: 62 socket = self.sockets[fn] 63 sock.close(socket) 64 del self.sockets[fn]
65
66 - def put(self, address, socket):
67 """ release socket in the pool 68 69 :param address: tuple (Host, address) 70 :param socket: a socket object 71 """ 72 connections = self.hosts.get(address) 73 if not connections: 74 connections = queue.LightQueue(None) 75 76 # do we have already enough connections opened ? 77 if connections.qsize() > self.max_connections: 78 sock.close(socket) 79 return 80 81 connections.put(socket, False) 82 self.sockets[socket.fileno()] = socket 83 eventlet.spawn(self.monitor_socket, socket.fileno()) 84 self.hosts[address] = connections
85
86 - def clear(self, address):
87 """ close all sockets in the pool for this address 88 89 :param address: tuple (Host, address) 90 """ 91 connections = self.hosts.get(address) 92 while True: 93 try: 94 socket = connections.get(False) 95 sock.close(socket) 96 socket.close() 97 except queue.Empty: 98 break
99