##// END OF EJS Templates
Merge pull request #1548 from minrk/ar_sugar...
Merge pull request #1548 from minrk/ar_sugar Add sugar methods/properties to AsyncResult that are generically useful: * `ar.wall_time` = received - submitted * `ar.serial_time` = sum of serial computation time * `ar.elapsed` = time since submission (wall_time if done) * `ar.progress` = (int) number of sub-tasks that have completed * `len(ar)` = # of tasks * `ar.wait_interactive()`: prints progress These are simple methods derived from the metadata/timestamps already created. But I've been persuaded by @wesm's practice of including simple methods that do useful (and/or cool) things. This also required/revealed some minor fixes/cleanup to clear_output in some cases: * dedent base `core.displaypub.clear_output`, so it's actually defined in the class * clear_output publishes `'\r\b'`, so it will clear terminal-like frontends that don't understand full clear_output behavior. * `core.display.clear_output()` still works, even outside an IPython session. Added a new notebook that shows how to use these new methods and how to do simple animations/progress bars using `clear_output()`. Added `Client.spin_thread(interval)` / `stop_spin_thread()` for running spin in a background thread, to keep zmq queue clear. This can be used to ensure that timing information is as accurate as possible (at the cost of having a background thread active).

File last commit:

r5214:d05b9909
r6485:e0b43119 merge
Show More
iploggerapp.py
103 lines | 3.0 KiB | text/x-python | PythonLexer
#!/usr/bin/env python
# encoding: utf-8
"""
A simple IPython logger application
Authors:
* MinRK
"""
#-----------------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------------
import os
import sys
import zmq
from IPython.core.profiledir import ProfileDir
from IPython.utils.traitlets import Bool, Dict, Unicode
from IPython.parallel.apps.baseapp import (
BaseParallelApplication,
base_aliases,
catch_config_error,
)
from IPython.parallel.apps.logwatcher import LogWatcher
#-----------------------------------------------------------------------------
# Module level variables
#-----------------------------------------------------------------------------
#: The default config file name for this application
default_config_file_name = u'iplogger_config.py'
_description = """Start an IPython logger for parallel computing.
IPython controllers and engines (and your own processes) can broadcast log messages
by registering a `zmq.log.handlers.PUBHandler` with the `logging` module. The
logger can be configured using command line options or using a cluster
directory. Cluster directories contain config, log and security files and are
usually located in your ipython directory and named as "profile_name".
See the `profile` and `profile-dir` options for details.
"""
#-----------------------------------------------------------------------------
# Main application
#-----------------------------------------------------------------------------
aliases = {}
aliases.update(base_aliases)
aliases.update(dict(url='LogWatcher.url', topics='LogWatcher.topics'))
class IPLoggerApp(BaseParallelApplication):
name = u'iplogger'
description = _description
config_file_name = Unicode(default_config_file_name)
classes = [LogWatcher, ProfileDir]
aliases = Dict(aliases)
@catch_config_error
def initialize(self, argv=None):
super(IPLoggerApp, self).initialize(argv)
self.init_watcher()
def init_watcher(self):
try:
self.watcher = LogWatcher(config=self.config, log=self.log)
except:
self.log.error("Couldn't start the LogWatcher", exc_info=True)
self.exit(1)
self.log.info("Listening for log messages on %r"%self.watcher.url)
def start(self):
self.watcher.start()
try:
self.watcher.loop.start()
except KeyboardInterrupt:
self.log.critical("Logging Interrupted, shutting down...\n")
def launch_new_instance():
"""Create and run the IPython LogWatcher"""
app = IPLoggerApp.instance()
app.initialize()
app.start()
if __name__ == '__main__':
launch_new_instance()