Show More
@@ -62,6 +62,7 class AsyncResult(object): | |||
|
62 | 62 | self._tracker = tracker |
|
63 | 63 | self._ready = False |
|
64 | 64 | self._success = None |
|
65 | self._metadata = None | |
|
65 | 66 | if len(msg_ids) == 1: |
|
66 | 67 | self._single_result = not isinstance(targets, (list, tuple)) |
|
67 | 68 | else: |
@@ -231,13 +232,13 class AsyncResult(object): | |||
|
231 | 232 | else: |
|
232 | 233 | raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key)) |
|
233 | 234 | |
|
234 | @check_ready | |
|
235 | 235 | def __getattr__(self, key): |
|
236 | 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 | 240 | raise AttributeError("%r object has no attribute %r"%( |
|
239 | 241 | self.__class__.__name__, key)) |
|
240 | return self.__getitem__(key) | |
|
241 | 242 | |
|
242 | 243 | # asynchronous iterator: |
|
243 | 244 | def __iter__(self): |
@@ -70,4 +70,46 class AsyncResultTest(ClusterTestCase): | |||
|
70 | 70 | self.assertEquals(sorted(d.keys()), sorted(self.client.ids)) |
|
71 | 71 | for eid,r in d.iteritems(): |
|
72 | 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 | 68 | data = range(16,0,-1) |
|
69 | 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 | 72 | self.assertTrue(isinstance(amr, pmod.AsyncMapResult)) |
|
73 |
# check individual elements, retrieved as they come |
|
|
74 | astheycame = list(amr) | |
|
73 | # check individual elements, retrieved as they come | |
|
74 | # list comprehension uses __iter__ | |
|
75 | astheycame = [ r for r in amr ] | |
|
75 | 76 | # Ensure that at least one result came out of order: |
|
76 | 77 | self.assertNotEquals(astheycame, reference, "should not have preserved order") |
|
77 | 78 | self.assertEquals(sorted(astheycame, reverse=True), reference, "result corrupted") |
@@ -86,9 +87,10 class TestLoadBalancedView(ClusterTestCase): | |||
|
86 | 87 | data = range(16,0,-1) |
|
87 | 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 | 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 | 94 | astheycame = list(amr) |
|
93 | 95 | # Ensure that results came in order |
|
94 | 96 | self.assertEquals(astheycame, reference) |
General Comments 0
You need to be logged in to leave comments.
Login now