Show More
@@ -62,6 +62,7 class AsyncResult(object): | |||||
62 | self._tracker = tracker |
|
62 | self._tracker = tracker | |
63 | self._ready = False |
|
63 | self._ready = False | |
64 | self._success = None |
|
64 | self._success = None | |
|
65 | self._metadata = None | |||
65 | if len(msg_ids) == 1: |
|
66 | if len(msg_ids) == 1: | |
66 | self._single_result = not isinstance(targets, (list, tuple)) |
|
67 | self._single_result = not isinstance(targets, (list, tuple)) | |
67 | else: |
|
68 | else: | |
@@ -231,13 +232,13 class AsyncResult(object): | |||||
231 | else: |
|
232 | else: | |
232 | raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key)) |
|
233 | raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key)) | |
233 |
|
234 | |||
234 | @check_ready |
|
|||
235 | def __getattr__(self, key): |
|
235 | def __getattr__(self, key): | |
236 | """getattr maps to getitem for convenient attr access to metadata.""" |
|
236 | """getattr maps to getitem for convenient attr access to metadata.""" | |
237 | if key not in self._metadata[0].keys(): |
|
237 | try: | |
|
238 | return self.__getitem__(key) | |||
|
239 | except (error.TimeoutError, KeyError): | |||
238 | raise AttributeError("%r object has no attribute %r"%( |
|
240 | raise AttributeError("%r object has no attribute %r"%( | |
239 | self.__class__.__name__, key)) |
|
241 | self.__class__.__name__, key)) | |
240 | return self.__getitem__(key) |
|
|||
241 |
|
242 | |||
242 | # asynchronous iterator: |
|
243 | # asynchronous iterator: | |
243 | def __iter__(self): |
|
244 | def __iter__(self): |
@@ -70,4 +70,46 class AsyncResultTest(ClusterTestCase): | |||||
70 | self.assertEquals(sorted(d.keys()), sorted(self.client.ids)) |
|
70 | self.assertEquals(sorted(d.keys()), sorted(self.client.ids)) | |
71 | for eid,r in d.iteritems(): |
|
71 | for eid,r in d.iteritems(): | |
72 | self.assertEquals(r, 5) |
|
72 | self.assertEquals(r, 5) | |
|
73 | ||||
|
74 | def test_list_amr(self): | |||
|
75 | ar = self.client.load_balanced_view().map_async(wait, [0.1]*5) | |||
|
76 | rlist = list(ar) | |||
|
77 | ||||
|
78 | def test_getattr(self): | |||
|
79 | ar = self.client[:].apply_async(wait, 0.5) | |||
|
80 | self.assertRaises(AttributeError, lambda : ar._foo) | |||
|
81 | self.assertRaises(AttributeError, lambda : ar.__length_hint__()) | |||
|
82 | self.assertRaises(AttributeError, lambda : ar.foo) | |||
|
83 | self.assertRaises(AttributeError, lambda : ar.engine_id) | |||
|
84 | self.assertFalse(hasattr(ar, '__length_hint__')) | |||
|
85 | self.assertFalse(hasattr(ar, 'foo')) | |||
|
86 | self.assertFalse(hasattr(ar, 'engine_id')) | |||
|
87 | ar.get(5) | |||
|
88 | self.assertRaises(AttributeError, lambda : ar._foo) | |||
|
89 | self.assertRaises(AttributeError, lambda : ar.__length_hint__()) | |||
|
90 | self.assertRaises(AttributeError, lambda : ar.foo) | |||
|
91 | self.assertTrue(isinstance(ar.engine_id, list)) | |||
|
92 | self.assertEquals(ar.engine_id, ar['engine_id']) | |||
|
93 | self.assertFalse(hasattr(ar, '__length_hint__')) | |||
|
94 | self.assertFalse(hasattr(ar, 'foo')) | |||
|
95 | self.assertTrue(hasattr(ar, 'engine_id')) | |||
|
96 | ||||
|
97 | def test_getitem(self): | |||
|
98 | ar = self.client[:].apply_async(wait, 0.5) | |||
|
99 | self.assertRaises(TimeoutError, lambda : ar['foo']) | |||
|
100 | self.assertRaises(TimeoutError, lambda : ar['engine_id']) | |||
|
101 | ar.get(5) | |||
|
102 | self.assertRaises(KeyError, lambda : ar['foo']) | |||
|
103 | self.assertTrue(isinstance(ar['engine_id'], list)) | |||
|
104 | self.assertEquals(ar.engine_id, ar['engine_id']) | |||
|
105 | ||||
|
106 | def test_single_result(self): | |||
|
107 | ar = self.client[-1].apply_async(wait, 0.5) | |||
|
108 | self.assertRaises(TimeoutError, lambda : ar['foo']) | |||
|
109 | self.assertRaises(TimeoutError, lambda : ar['engine_id']) | |||
|
110 | self.assertTrue(ar.get(5) == 0.5) | |||
|
111 | self.assertTrue(isinstance(ar['engine_id'], int)) | |||
|
112 | self.assertTrue(isinstance(ar.engine_id, int)) | |||
|
113 | self.assertEquals(ar.engine_id, ar['engine_id']) | |||
|
114 | ||||
73 |
|
115 |
@@ -68,10 +68,11 class TestLoadBalancedView(ClusterTestCase): | |||||
68 | data = range(16,0,-1) |
|
68 | data = range(16,0,-1) | |
69 | reference = map(f, data) |
|
69 | reference = map(f, data) | |
70 |
|
70 | |||
71 | amr = self.view.map_async(f, data, ordered=False) |
|
71 | amr = self.view.map_async(slow_f, data, ordered=False) | |
72 | self.assertTrue(isinstance(amr, pmod.AsyncMapResult)) |
|
72 | self.assertTrue(isinstance(amr, pmod.AsyncMapResult)) | |
73 |
# check individual elements, retrieved as they come |
|
73 | # check individual elements, retrieved as they come | |
74 | astheycame = list(amr) |
|
74 | # list comprehension uses __iter__ | |
|
75 | astheycame = [ r for r in amr ] | |||
75 | # Ensure that at least one result came out of order: |
|
76 | # Ensure that at least one result came out of order: | |
76 | self.assertNotEquals(astheycame, reference, "should not have preserved order") |
|
77 | self.assertNotEquals(astheycame, reference, "should not have preserved order") | |
77 | self.assertEquals(sorted(astheycame, reverse=True), reference, "result corrupted") |
|
78 | self.assertEquals(sorted(astheycame, reverse=True), reference, "result corrupted") | |
@@ -86,9 +87,10 class TestLoadBalancedView(ClusterTestCase): | |||||
86 | data = range(16,0,-1) |
|
87 | data = range(16,0,-1) | |
87 | reference = map(f, data) |
|
88 | reference = map(f, data) | |
88 |
|
89 | |||
89 | amr = self.view.map_async(f, data) |
|
90 | amr = self.view.map_async(slow_f, data) | |
90 | self.assertTrue(isinstance(amr, pmod.AsyncMapResult)) |
|
91 | self.assertTrue(isinstance(amr, pmod.AsyncMapResult)) | |
91 |
# check individual elements, retrieved as they come |
|
92 | # check individual elements, retrieved as they come | |
|
93 | # list(amr) uses __iter__ | |||
92 | astheycame = list(amr) |
|
94 | astheycame = list(amr) | |
93 | # Ensure that results came in order |
|
95 | # Ensure that results came in order | |
94 | self.assertEquals(astheycame, reference) |
|
96 | self.assertEquals(astheycame, reference) |
General Comments 0
You need to be logged in to leave comments.
Login now