blob: d1a55a661c44821d47eb4f9aca2368fca0e8703b [file] [log] [blame]
Benjamin Petersone711caf2008-06-11 16:44:04 +00001#
2# This module shows how to use arbitrary callables with a subclass of
3# `BaseManager`.
4#
Benjamin Peterson4469d0c2008-11-30 22:46:23 +00005# Copyright (c) 2006-2008, R Oudkerk
6# All rights reserved.
7#
Benjamin Petersone711caf2008-06-11 16:44:04 +00008
9from multiprocessing import freeze_support
10from multiprocessing.managers import BaseManager, BaseProxy
11import operator
12
13##
14
15class Foo(object):
16 def f(self):
Christian Heimesaae1b702008-11-28 11:23:26 +000017 print('you called Foo.f()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000018 def g(self):
Christian Heimesaae1b702008-11-28 11:23:26 +000019 print('you called Foo.g()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000020 def _h(self):
Christian Heimesaae1b702008-11-28 11:23:26 +000021 print('you called Foo._h()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000022
23# A simple generator function
24def baz():
Christian Heimesaae1b702008-11-28 11:23:26 +000025 for i in range(10):
Benjamin Petersone711caf2008-06-11 16:44:04 +000026 yield i*i
27
28# Proxy type for generator objects
29class GeneratorProxy(BaseProxy):
30 _exposed_ = ('next', '__next__')
31 def __iter__(self):
32 return self
Christian Heimesaae1b702008-11-28 11:23:26 +000033 def __next__(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +000034 return self._callmethod('next')
35 def __next__(self):
36 return self._callmethod('__next__')
37
38# Function to return the operator module
39def get_operator_module():
40 return operator
41
42##
43
44class MyManager(BaseManager):
45 pass
46
47# register the Foo class; make `f()` and `g()` accessible via proxy
48MyManager.register('Foo1', Foo)
49
50# register the Foo class; make `g()` and `_h()` accessible via proxy
51MyManager.register('Foo2', Foo, exposed=('g', '_h'))
52
53# register the generator function baz; use `GeneratorProxy` to make proxies
54MyManager.register('baz', baz, proxytype=GeneratorProxy)
55
56# register get_operator_module(); make public functions accessible via proxy
57MyManager.register('operator', get_operator_module)
58
59##
60
61def test():
62 manager = MyManager()
63 manager.start()
64
Christian Heimesaae1b702008-11-28 11:23:26 +000065 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000066
67 f1 = manager.Foo1()
68 f1.f()
69 f1.g()
70 assert not hasattr(f1, '_h')
71 assert sorted(f1._exposed_) == sorted(['f', 'g'])
72
Christian Heimesaae1b702008-11-28 11:23:26 +000073 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000074
75 f2 = manager.Foo2()
76 f2.g()
77 f2._h()
78 assert not hasattr(f2, 'f')
79 assert sorted(f2._exposed_) == sorted(['g', '_h'])
80
Christian Heimesaae1b702008-11-28 11:23:26 +000081 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000082
83 it = manager.baz()
84 for i in it:
Christian Heimesaae1b702008-11-28 11:23:26 +000085 print('<%d>' % i, end=' ')
86 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +000087
Christian Heimesaae1b702008-11-28 11:23:26 +000088 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000089
90 op = manager.operator()
Christian Heimesaae1b702008-11-28 11:23:26 +000091 print('op.add(23, 45) =', op.add(23, 45))
92 print('op.pow(2, 94) =', op.pow(2, 94))
93 print('op.getslice(range(10), 2, 6) =', op.getslice(list(range(10)), 2, 6))
94 print('op.repeat(range(5), 3) =', op.repeat(list(range(5)), 3))
95 print('op._exposed_ =', op._exposed_)
Benjamin Petersone711caf2008-06-11 16:44:04 +000096
97##
98
99if __name__ == '__main__':
100 freeze_support()
101 test()