/Doc/includes/mp_newtype.py

http://unladen-swallow.googlecode.com/ · Python · 101 lines · 59 code · 24 blank · 18 comment · 3 complexity · 7fd3c8f39caf215dd8524fb637978e02 MD5 · raw file

  1. #
  2. # This module shows how to use arbitrary callables with a subclass of
  3. # `BaseManager`.
  4. #
  5. # Copyright (c) 2006-2008, R Oudkerk
  6. # All rights reserved.
  7. #
  8. from multiprocessing import freeze_support
  9. from multiprocessing.managers import BaseManager, BaseProxy
  10. import operator
  11. ##
  12. class Foo(object):
  13. def f(self):
  14. print 'you called Foo.f()'
  15. def g(self):
  16. print 'you called Foo.g()'
  17. def _h(self):
  18. print 'you called Foo._h()'
  19. # A simple generator function
  20. def baz():
  21. for i in xrange(10):
  22. yield i*i
  23. # Proxy type for generator objects
  24. class GeneratorProxy(BaseProxy):
  25. _exposed_ = ('next', '__next__')
  26. def __iter__(self):
  27. return self
  28. def next(self):
  29. return self._callmethod('next')
  30. def __next__(self):
  31. return self._callmethod('__next__')
  32. # Function to return the operator module
  33. def get_operator_module():
  34. return operator
  35. ##
  36. class MyManager(BaseManager):
  37. pass
  38. # register the Foo class; make `f()` and `g()` accessible via proxy
  39. MyManager.register('Foo1', Foo)
  40. # register the Foo class; make `g()` and `_h()` accessible via proxy
  41. MyManager.register('Foo2', Foo, exposed=('g', '_h'))
  42. # register the generator function baz; use `GeneratorProxy` to make proxies
  43. MyManager.register('baz', baz, proxytype=GeneratorProxy)
  44. # register get_operator_module(); make public functions accessible via proxy
  45. MyManager.register('operator', get_operator_module)
  46. ##
  47. def test():
  48. manager = MyManager()
  49. manager.start()
  50. print '-' * 20
  51. f1 = manager.Foo1()
  52. f1.f()
  53. f1.g()
  54. assert not hasattr(f1, '_h')
  55. assert sorted(f1._exposed_) == sorted(['f', 'g'])
  56. print '-' * 20
  57. f2 = manager.Foo2()
  58. f2.g()
  59. f2._h()
  60. assert not hasattr(f2, 'f')
  61. assert sorted(f2._exposed_) == sorted(['g', '_h'])
  62. print '-' * 20
  63. it = manager.baz()
  64. for i in it:
  65. print '<%d>' % i,
  66. print
  67. print '-' * 20
  68. op = manager.operator()
  69. print 'op.add(23, 45) =', op.add(23, 45)
  70. print 'op.pow(2, 94) =', op.pow(2, 94)
  71. print 'op.getslice(range(10), 2, 6) =', op.getslice(range(10), 2, 6)
  72. print 'op.repeat(range(5), 3) =', op.repeat(range(5), 3)
  73. print 'op._exposed_ =', op._exposed_
  74. ##
  75. if __name__ == '__main__':
  76. freeze_support()
  77. test()