|
|
# 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
|
|
|
"""
|
|
|
|
|
|
__docformat__ = "restructuredtext en"
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Copyright (C) 2008 The IPython Development Team
|
|
|
#
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
import sys
|
|
|
|
|
|
# from IPython.tools import growl
|
|
|
# growl.start("IPython1 Client")
|
|
|
|
|
|
|
|
|
from twisted.internet import reactor
|
|
|
from IPython.kernel.clientconnector import ClientConnector
|
|
|
from IPython.kernel.twistedutil import ReactorInThread
|
|
|
from IPython.kernel.twistedutil import blockingCallFromThread
|
|
|
|
|
|
# These enable various things
|
|
|
from IPython.kernel import codeutil
|
|
|
import IPython.kernel.magic
|
|
|
|
|
|
# Other things that the user will need
|
|
|
from IPython.kernel.task import MapTask, StringTask
|
|
|
from IPython.kernel.error import CompositeError
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Code
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
_client_tub = ClientConnector()
|
|
|
|
|
|
|
|
|
def get_multiengine_client(furl_or_file=''):
|
|
|
"""Get the blocking MultiEngine client.
|
|
|
|
|
|
:Parameters:
|
|
|
furl_or_file : str
|
|
|
A furl or a filename containing a furl. If empty, the
|
|
|
default furl_file will be used
|
|
|
|
|
|
:Returns:
|
|
|
The connected MultiEngineClient instance
|
|
|
"""
|
|
|
client = blockingCallFromThread(_client_tub.get_multiengine_client,
|
|
|
furl_or_file)
|
|
|
return client.adapt_to_blocking_client()
|
|
|
|
|
|
def get_task_client(furl_or_file=''):
|
|
|
"""Get the blocking Task client.
|
|
|
|
|
|
:Parameters:
|
|
|
furl_or_file : str
|
|
|
A furl or a filename containing a furl. If empty, the
|
|
|
default furl_file will be used
|
|
|
|
|
|
:Returns:
|
|
|
The connected TaskClient instance
|
|
|
"""
|
|
|
client = blockingCallFromThread(_client_tub.get_task_client,
|
|
|
furl_or_file)
|
|
|
return client.adapt_to_blocking_client()
|
|
|
|
|
|
|
|
|
MultiEngineClient = get_multiengine_client
|
|
|
TaskClient = get_task_client
|
|
|
|
|
|
|
|
|
|
|
|
# Now we start the reactor in a thread
|
|
|
rit = ReactorInThread()
|
|
|
rit.setDaemon(True)
|
|
|
rit.start()
|