client.py
110 lines
| 3.5 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2306 | #!/usr/bin/env python | ||
Brian E Granger
|
r1234 | # encoding: utf-8 | ||
"""This module contains blocking clients for the controller interfaces. | ||||
Unlike the clients in `asyncclient.py`, the clients in this module are fully | ||||
blocking. This means that methods on the clients return the actual results | ||||
rather than a deferred to the result. Also, we manage the Twisted reactor | ||||
for you. This is done by running the reactor in a thread. | ||||
The main classes in this module are: | ||||
* MultiEngineClient | ||||
* TaskClient | ||||
* Task | ||||
* CompositeError | ||||
""" | ||||
Brian Granger
|
r2306 | #----------------------------------------------------------------------------- | ||
# Copyright (C) 2008-2009 The IPython Development Team | ||||
Brian E Granger
|
r1234 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
Brian Granger
|
r2306 | #----------------------------------------------------------------------------- | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2306 | #----------------------------------------------------------------------------- | ||
Brian Granger
|
r2520 | # Warnings control | ||
Brian Granger
|
r2306 | #----------------------------------------------------------------------------- | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2306 | import warnings | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2520 | # Twisted generates annoying warnings with Python 2.6, as will do other code | ||
# that imports 'sets' as of today | ||||
warnings.filterwarnings('ignore', 'the sets module is deprecated', | ||||
DeprecationWarning ) | ||||
# This one also comes from Twisted | ||||
warnings.filterwarnings('ignore', 'the sha module is deprecated', | ||||
DeprecationWarning) | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2520 | import sys | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r3239 | import twisted | ||
Brian E Granger
|
r1234 | from twisted.internet import reactor | ||
Brian Granger
|
r2306 | from twisted.python import log | ||
from IPython.kernel.clientconnector import ClientConnector, Cluster | ||||
Brian E Granger
|
r1234 | from IPython.kernel.twistedutil import ReactorInThread | ||
from IPython.kernel.twistedutil import blockingCallFromThread | ||||
# These enable various things | ||||
from IPython.kernel import codeutil | ||||
# Other things that the user will need | ||||
Brian E Granger
|
r1395 | from IPython.kernel.task import MapTask, StringTask | ||
Brian E Granger
|
r1234 | from IPython.kernel.error import CompositeError | ||
#------------------------------------------------------------------------------- | ||||
# Code | ||||
#------------------------------------------------------------------------------- | ||||
Brian Granger
|
r3239 | # PotentialZombieWarning is deprecated from Twisted 10.0.0 and above and | ||
# using the filter on > 10.0.0 creates a warning itself. | ||||
if twisted.version.major < 10: | ||||
from twisted.internet.error import PotentialZombieWarning | ||||
warnings.simplefilter('ignore', PotentialZombieWarning) | ||||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2306 | _client_tub = ClientConnector() | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r2306 | get_multiengine_client = _client_tub.get_multiengine_client | ||
get_task_client = _client_tub.get_task_client | ||||
Brian E Granger
|
r1234 | MultiEngineClient = get_multiengine_client | ||
TaskClient = get_task_client | ||||
Brian Granger
|
r2308 | # This isn't great. I should probably set this up in the ReactorInThread | ||
# class below. But, it does work for now. | ||||
Brian Granger
|
r2306 | log.startLogging(sys.stdout, setStdout=0) | ||
Brian E Granger
|
r1234 | |||
Brian Granger
|
r3239 | def _result_list_printer(obj, p, cycle): | ||
if cycle: | ||||
return p.text('ResultList(...)') | ||||
return p.text(repr(obj)) | ||||
# ResultList is a list subclass and will use the default pretty printer. | ||||
# This overrides that to use the __repr__ of ResultList. | ||||
ip = get_ipython() | ||||
ip.displayhook.default_formatter.for_type_by_name( | ||||
'IPython.kernel.multiengineclient', 'ResultList', _result_list_printer | ||||
) | ||||
Brian E Granger
|
r1234 | # Now we start the reactor in a thread | ||
rit = ReactorInThread() | ||||
rit.setDaemon(True) | ||||
Brian Granger
|
r2306 | rit.start() | ||
__all__ = [ | ||||
'MapTask', | ||||
'StringTask', | ||||
'MultiEngineClient', | ||||
'TaskClient', | ||||
'CompositeError', | ||||
'get_task_client', | ||||
'get_multiengine_client', | ||||
'Cluster' | ||||
] | ||||