Package grassyknoll :: Package collection :: Module ThreadCollection
[hide private]

Source Code for Module grassyknoll.collection.ThreadCollection

 1  """contains L{ThreadCollection}""" 
 2   
 3  from Collection import Collection 
 4  from grassyknoll.concurrent.ThreadPool import ThreadPool 
 5  from grassyknoll.concurrent.lib import chat 
 6  from grassyknoll.concurrent.Wrappers import (objectMessenger, errorMessenger, 
 7                                               MethodCall, FactoryContextManager, 
 8                                               debugMessenger) 
 9   
10  from grassyknoll.lib.util import ensureName 
11   
12 -class ThreadCollection(Collection):
13
14 - def __init__(self, writer_factory, reader_factory, name=None, 15 writer_pool_factory=ThreadPool, reader_pool_factory=ThreadPool):
16 name = self.name = ensureName(name) 17 # XXX various race conditions if the writer needs to create directories, etc. 18 self.writer=writer_pool_factory(FactoryContextManager.factory(factory=writer_factory, 19 more_decorators=[debugMessenger, 20 errorMessenger(NotImplementedError), 21 objectMessenger]), 22 name="%s-writer"%name) 23 24 25 self.reader=reader_pool_factory(FactoryContextManager.factory(factory=reader_factory, 26 more_decorators=[debugMessenger, 27 errorMessenger(NotImplementedError), 28 objectMessenger]), 29 name="%s-reader"%name)
30 - def start(self):
31 self.writer.start() 32 self.reader.start()
33
34 - def create(self, docs):
35 return chat(MethodCall('create', docs), 36 self.writer.inbox, None)
37
38 - def delete(self, ids):
39 return chat(MethodCall('delete', ids), 40 self.writer.inbox)
41
42 - def list(self):
43 return chat(MethodCall('list'), 44 self.reader.inbox)
45
46 - def retrieve(self, ids, fields=None):
47 return chat(MethodCall('retrieve', ids, fields=fields), 48 self.reader.inbox)
49
50 - def __getattr__(self, name):
51 # XXX it'd be better to bind these as methods on the instance at 52 # create time, but that requires better support for factory 53 # introspection, see issue #34. That would also avoid AttributeError 54 # weirdness, see issue #62. 55 if name.endswith('Query'): 56 return lambda **kwargs: chat(MethodCall(name, **kwargs), self.reader.inbox) 57 else: 58 raise AttributeError(name)
59
60 - def close(self):
61 self.writer.stop() 62 self.reader.stop()
63