signalkernel.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """Test kernel for signalling subprocesses"""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. from __future__ import print_function
  5. from subprocess import Popen, PIPE
  6. import sys
  7. import time
  8. from ipykernel.displayhook import ZMQDisplayHook
  9. from ipykernel.kernelbase import Kernel
  10. from ipykernel.kernelapp import IPKernelApp
  11. class SignalTestKernel(Kernel):
  12. """Kernel for testing subprocess signaling"""
  13. implementation = 'signaltest'
  14. implementation_version = '0.0'
  15. banner = ''
  16. def __init__(self, **kwargs):
  17. kwargs.pop('user_ns', None)
  18. super(SignalTestKernel, self).__init__(**kwargs)
  19. self.children = []
  20. def do_execute(self, code, silent, store_history=True, user_expressions=None,
  21. allow_stdin=False):
  22. code = code.strip()
  23. reply = {
  24. 'status': 'ok',
  25. 'user_expressions': {},
  26. }
  27. if code == 'start':
  28. child = Popen(['bash', '-i', '-c', 'sleep 30'], stderr=PIPE)
  29. self.children.append(child)
  30. reply['user_expressions']['pid'] = self.children[-1].pid
  31. elif code == 'check':
  32. reply['user_expressions']['poll'] = [ child.poll() for child in self.children ]
  33. elif code == 'sleep':
  34. try:
  35. time.sleep(10)
  36. except KeyboardInterrupt:
  37. reply['user_expressions']['interrupted'] = True
  38. else:
  39. reply['user_expressions']['interrupted'] = False
  40. else:
  41. reply['status'] = 'error'
  42. reply['ename'] = 'Error'
  43. reply['evalue'] = code
  44. reply['traceback'] = ['no such command: %s' % code]
  45. return reply
  46. def kernel_info_request(self, *args, **kwargs):
  47. """Add delay to kernel_info_request
  48. triggers slow-response code in KernelClient.wait_for_ready
  49. """
  50. return super(SignalTestKernel, self).kernel_info_request(*args, **kwargs)
  51. class SignalTestApp(IPKernelApp):
  52. kernel_class = SignalTestKernel
  53. def init_io(self):
  54. # Overridden to disable stdout/stderr capture
  55. self.displayhook = ZMQDisplayHook(self.session, self.iopub_socket)
  56. if __name__ == '__main__':
  57. # make startup artificially slow,
  58. # so that we exercise client logic for slow-starting kernels
  59. time.sleep(2)
  60. SignalTestApp.launch_instance()