##// END OF EJS Templates
Lots of work on exception handling, including tests for traceback printing....
Lots of work on exception handling, including tests for traceback printing. We finally have some tests for various exception mode printing, via doctests that exercise all three modes! Also changed handling of sys.exit(X) to only print the summary message, as SystemExit is most often a 'handled' exception. It can still be 100% silenced via '%run -e', but now it's much less intrusive. Added a new %tb magic to print the last available traceback with the current xmode. One can then re-print the last traceback with more detail if desired, without having to cause it again.

File last commit:

r1338:72652d65
r2440:0caaf43a
Show More
multiengine1.ipy
227 lines | 3.7 KiB | text/plain | TextLexer
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
import time
import numpy
import IPython.kernel.magic
from IPython.kernel import client
from IPython.kernel.error import *
mec = client.MultiEngineClient()
#-------------------------------------------------------------------------------
# Setup
#-------------------------------------------------------------------------------
mec.reset()
mec.activate()
mec.block = True
mec.get_ids()
n = len(mec)
assert n >= 4, "Not Enough Engines: %i, 4 needed for this script"%n
values = [
10,
1.0,
range(100),
('asdf', 1000),
{'a': 10, 'b': 20}
]
keys = ['a','b','c','d','e']
sequences = [
range(100),
numpy.arange(100)
]
#-------------------------------------------------------------------------------
# Blocking execution
#-------------------------------------------------------------------------------
# Execute
mec.execute('import math')
mec.execute('a = 2.0*math.pi')
mec.execute('print a')
for id in mec.get_ids():
mec.execute('b=%d' % id, targets=id)
mec.execute('print b')
try:
mec.execute('b = 10',targets=-1)
except InvalidEngineID:
print "Caught invalid engine ID OK."
try:
mec.execute('a=5; 1/0')
except CompositeError:
print "Caught 1/0 correctly."
%px print a, b
try:
%px 1/0
except CompositeError:
print "Caught 1/0 correctly."
%autopx
import numpy
a = numpy.random.rand(4,4)
a = a+a.transpose()
print numpy.linalg.eigvals(a)
%autopx
mec.targets = [0,2]
%px a = 5
mec.targets = [1,3]
%px a = 10
mec.targets = 'all'
%px print a
# Push/Pull
mec.push(dict(a=10, b=30, c={'f':range(10)}))
mec.pull(('a', 'b'))
mec.zip_pull(('a', 'b'))
for id in mec.get_ids():
mec.push(dict(a=id), targets=id)
for id in mec.get_ids():
mec.pull('a', targets=id)
mec.pull('a')
mec['a'] = 100
mec['a']
# get_result/reset/keys
mec.get_result()
%result
mec.keys()
mec.reset()
mec.keys()
try:
%result
except CompositeError:
print "Caught IndexError ok."
%px a = 5
mec.get_result(1)
mec.keys()
# Queue management methods
%px import time
prs = [mec.execute('time.sleep(2.0)',block=False) for x in range(5)]
mec.queue_status()
time.sleep(3.0)
mec.clear_queue()
mec.queue_status()
time.sleep(2.0)
mec.queue_status()
mec.barrier(prs)
for pr in prs:
try:
pr.r
except CompositeError:
print "Caught QueueCleared OK."
# scatter/gather
mec.scatter('a', range(10))
mec.gather('a')
mec.scatter('b', numpy.arange(10))
mec.gather('b')
#-------------------------------------------------------------------------------
# Non-Blocking execution
#-------------------------------------------------------------------------------
mec.block = False
# execute
pr1 = mec.execute('a=5')
pr2 = mec.execute('import sets')
mec.barrier((pr1, pr2))
pr1 = mec.execute('1/0')
pr2 = mec.execute('c = sets.Set()')
mec.barrier((pr1, pr2))
try:
pr1.r
except CompositeError:
print "Caught ZeroDivisionError OK."
pr = mec.execute("print 'hi'")
pr.r
pr = mec.execute('1/0')
try:
pr.r
except CompositeError:
print "Caught ZeroDivisionError OK."
# Make sure we can reraise it!
try:
pr.r
except CompositeError:
print "Caught ZeroDivisionError OK."
# push/pull
pr1 = mec.push(dict(a=10))
pr1.get_result()
pr2 = mec.pull('a')
pr2.r
# flush
mec.flush()
pd1 = mec.execute('a=30')
pd2 = mec.pull('a')
mec.flush()
try:
pd1.get_result()
except InvalidDeferredID:
print "PendingResult object was cleared OK."
try:
pd2.get_result()
except InvalidDeferredID:
print "PendingResult object was cleared OK."
# This is a command to make sure the end of the file is happy.
print "The tests are done!"