##// END OF EJS Templates
Start webbrowser in a thread. Prevents lockup with Chrome....
Start webbrowser in a thread. Prevents lockup with Chrome. If a user has Chrome set as their default browser (system-wide or via the `BROWSER` environment variable), opening the notebook hangs because the chrome call doesn't return immediately. This solves the issue by opening the browser in a thread. Note that there remains an issue where killing the notebook will kill Chrome if the Chrome session was started by us. I haven't found a way to work around that despite attempts by making the webbrowser.open() call in a subprocess.

File last commit:

r4214:21c18a1e
r5212:2178365f
Show More
__init__.py
111 lines | 3.7 KiB | text/x-python | PythonLexer
MinRK
some initial tests for newparallel
r3637 """toplevel setup/teardown for parallel tests."""
MinRK
update API after sagedays29...
r3664 #-------------------------------------------------------------------------------
# Copyright (C) 2011 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
#-------------------------------------------------------------------------------
MinRK
better, more forceful wait for controller to start
r3678 import os
MinRK
add message tracking to client, add/improve tests
r3654 import tempfile
MinRK
added preliminary tests for zmq.parallel
r3595 import time
MinRK
improve process cleanup on Windows...
r3778 from subprocess import Popen
MinRK
added preliminary tests for zmq.parallel
r3595
MinRK
better, more forceful wait for controller to start
r3678 from IPython.utils.path import get_ipython_dir
MinRK
organize IPython.parallel into subpackages
r3673 from IPython.parallel import Client
MinRK
improve process cleanup on Windows...
r3778 from IPython.parallel.apps.launcher import (LocalProcessLauncher,
ipengine_cmd_argv,
ipcontroller_cmd_argv,
SIGKILL)
MinRK
added preliminary tests for zmq.parallel
r3595
MinRK
improve process cleanup on Windows...
r3778 # globals
launchers = []
blackhole = open(os.devnull, 'w')
# Launcher class
class TestProcessLauncher(LocalProcessLauncher):
"""subclass LocalProcessLauncher, to prevent extra sockets and threads being created on Windows"""
def start(self):
if self.state == 'before':
self.process = Popen(self.args,
stdout=blackhole, stderr=blackhole,
env=os.environ,
cwd=self.work_dir
)
self.notify_start(self.process.pid)
self.poll = self.process.poll
else:
s = 'The process was already started and has state: %r' % self.state
raise ProcessStateError(s)
MinRK
some initial tests for newparallel
r3637
# nose setup/teardown
MinRK
added preliminary tests for zmq.parallel
r3595
def setup():
MinRK
don't reuse connection files in parallel tests
r4116 cluster_dir = os.path.join(get_ipython_dir(), 'profile_iptest')
engine_json = os.path.join(cluster_dir, 'security', 'ipcontroller-engine.json')
client_json = os.path.join(cluster_dir, 'security', 'ipcontroller-client.json')
for json in (engine_json, client_json):
if os.path.exists(json):
os.remove(json)
MinRK
improve process cleanup on Windows...
r3778 cp = TestProcessLauncher()
cp.cmd_and_args = ipcontroller_cmd_argv + \
MinRK
aliases match flag pattern ('-' as wordsep, not '_')...
r4214 ['--profile=iptest', '--log-level=50']
MinRK
improve process cleanup on Windows...
r3778 cp.start()
launchers.append(cp)
MinRK
better handle controller/engines never starting in tests
r3680 tic = time.time()
while not os.path.exists(engine_json) or not os.path.exists(client_json):
if cp.poll() is not None:
print cp.poll()
raise RuntimeError("The test controller failed to start.")
elif time.time()-tic > 10:
raise RuntimeError("Timeout waiting for the test controller to start.")
MinRK
better, more forceful wait for controller to start
r3678 time.sleep(0.1)
MinRK
update API after sagedays29...
r3664 add_engines(1)
MinRK
added preliminary tests for zmq.parallel
r3595
MinRK
update API after sagedays29...
r3664 def add_engines(n=1, profile='iptest'):
MinRK
organize IPython.parallel into subpackages
r3673 rc = Client(profile=profile)
MinRK
update API after sagedays29...
r3664 base = len(rc)
eps = []
for i in range(n):
MinRK
improve process cleanup on Windows...
r3778 ep = TestProcessLauncher()
MinRK
aliases match flag pattern ('-' as wordsep, not '_')...
r4214 ep.cmd_and_args = ipengine_cmd_argv + ['--profile=%s'%profile, '--log-level=50']
MinRK
improve process cleanup on Windows...
r3778 ep.start()
launchers.append(ep)
MinRK
update API after sagedays29...
r3664 eps.append(ep)
MinRK
better handle controller/engines never starting in tests
r3680 tic = time.time()
MinRK
update API after sagedays29...
r3664 while len(rc) < base+n:
MinRK
better handle controller/engines never starting in tests
r3680 if any([ ep.poll() is not None for ep in eps ]):
raise RuntimeError("A test engine failed to start.")
elif time.time()-tic > 10:
raise RuntimeError("Timeout waiting for engines to connect.")
MinRK
update API after sagedays29...
r3664 time.sleep(.1)
rc.spin()
rc.close()
return eps
MinRK
added preliminary tests for zmq.parallel
r3595
def teardown():
time.sleep(1)
MinRK
improve process cleanup on Windows...
r3778 while launchers:
p = launchers.pop()
MinRK
added preliminary tests for zmq.parallel
r3595 if p.poll() is None:
try:
MinRK
improve process cleanup on Windows...
r3778 p.stop()
MinRK
added preliminary tests for zmq.parallel
r3595 except Exception, e:
print e
pass
if p.poll() is None:
time.sleep(.25)
if p.poll() is None:
try:
MinRK
improve process cleanup on Windows...
r3778 print 'cleaning up test process...'
p.signal(SIGKILL)
MinRK
added preliminary tests for zmq.parallel
r3595 except:
MinRK
reflect revised apply_bound pattern
r3655 print "couldn't shutdown process: ", p
MinRK
improve process cleanup on Windows...
r3778 blackhole.close()
MinRK
added preliminary tests for zmq.parallel
r3595