blob: 1c796a564049ad8c39ceca56be0ccf47bcab5a48 [file] [log] [blame]
Benjamin Petersone711caf2008-06-11 16:44:04 +00001from multiprocessing import freeze_support
2from multiprocessing.managers import BaseManager, BaseProxy
3import operator
4
5##
6
Éric Araujo28053fb2010-11-22 03:09:19 +00007class Foo:
Benjamin Petersone711caf2008-06-11 16:44:04 +00008 def f(self):
Christian Heimesaae1b702008-11-28 11:23:26 +00009 print('you called Foo.f()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000010 def g(self):
Christian Heimesaae1b702008-11-28 11:23:26 +000011 print('you called Foo.g()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000012 def _h(self):
Christian Heimesaae1b702008-11-28 11:23:26 +000013 print('you called Foo._h()')
Benjamin Petersone711caf2008-06-11 16:44:04 +000014
15# A simple generator function
16def baz():
Christian Heimesaae1b702008-11-28 11:23:26 +000017 for i in range(10):
Benjamin Petersone711caf2008-06-11 16:44:04 +000018 yield i*i
19
20# Proxy type for generator objects
21class GeneratorProxy(BaseProxy):
Richard Oudkerk84ed9a62013-08-14 15:35:41 +010022 _exposed_ = ['__next__']
Benjamin Petersone711caf2008-06-11 16:44:04 +000023 def __iter__(self):
24 return self
Christian Heimesaae1b702008-11-28 11:23:26 +000025 def __next__(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +000026 return self._callmethod('__next__')
27
28# Function to return the operator module
29def get_operator_module():
30 return operator
31
32##
33
34class MyManager(BaseManager):
35 pass
36
37# register the Foo class; make `f()` and `g()` accessible via proxy
38MyManager.register('Foo1', Foo)
39
40# register the Foo class; make `g()` and `_h()` accessible via proxy
41MyManager.register('Foo2', Foo, exposed=('g', '_h'))
42
43# register the generator function baz; use `GeneratorProxy` to make proxies
44MyManager.register('baz', baz, proxytype=GeneratorProxy)
45
46# register get_operator_module(); make public functions accessible via proxy
47MyManager.register('operator', get_operator_module)
48
49##
50
51def test():
52 manager = MyManager()
53 manager.start()
54
Christian Heimesaae1b702008-11-28 11:23:26 +000055 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000056
57 f1 = manager.Foo1()
58 f1.f()
59 f1.g()
60 assert not hasattr(f1, '_h')
61 assert sorted(f1._exposed_) == sorted(['f', 'g'])
62
Christian Heimesaae1b702008-11-28 11:23:26 +000063 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000064
65 f2 = manager.Foo2()
66 f2.g()
67 f2._h()
68 assert not hasattr(f2, 'f')
69 assert sorted(f2._exposed_) == sorted(['g', '_h'])
70
Christian Heimesaae1b702008-11-28 11:23:26 +000071 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000072
73 it = manager.baz()
74 for i in it:
Christian Heimesaae1b702008-11-28 11:23:26 +000075 print('<%d>' % i, end=' ')
76 print()
Benjamin Petersone711caf2008-06-11 16:44:04 +000077
Christian Heimesaae1b702008-11-28 11:23:26 +000078 print('-' * 20)
Benjamin Petersone711caf2008-06-11 16:44:04 +000079
80 op = manager.operator()
Christian Heimesaae1b702008-11-28 11:23:26 +000081 print('op.add(23, 45) =', op.add(23, 45))
82 print('op.pow(2, 94) =', op.pow(2, 94))
Christian Heimesaae1b702008-11-28 11:23:26 +000083 print('op._exposed_ =', op._exposed_)
Benjamin Petersone711caf2008-06-11 16:44:04 +000084
85##
86
87if __name__ == '__main__':
88 freeze_support()
89 test()