1
2
3
4
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
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
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
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