All pastes #1879986 Raw Edit

Python process management with C

public python v1 · immutable
#1879986 ·published 2010-06-09 20:04 UTC
rendered paste body
# -*- coding: utf-8 -*-import randomimport stringimport sysfrom multiprocessing import Process, Queuefrom Queue import Emptyimport loggingfrom logging import handlersfrom cherrypy.process import wspbusclass MyBus(wspbus.Bus):    def __init__(self, name=""):        wspbus.Bus.__init__(self)        self.open_logger(name)        self.subscribe("log", self._log)    def exit(self):        wspbus.Bus.exit(self)        self.close_logger()    def open_logger(self, name=""):        logger = logging.getLogger(name)        logger.setLevel(logging.INFO)        h = logging.StreamHandler(sys.stdout)        h.setLevel(logging.INFO)        h.setFormatter(logging.Formatter("[%(asctime)s] %(name)s - %(levelname)s - %(message)s"))        logger.addHandler(h)        self.logger = logger    def close_logger(self):        for handler in self.logger.handlers:            handler.flush()            handler.close()                def _log(self, msg="", level=logging.INFO):        self.logger.log(level, msg)class Broker(Process):    def __init__(self, queue):        Process.__init__(self)        self.queue = queue        self.bus = MyBus(Broker.__name__)        self.bus.subscribe("main", self.check)    def check(self):        try:            message = self.queue.get_nowait()        except Empty:            return                if message == "stop":            self.bus.unsubscribe("main", self.check)            self.bus.exit()        elif message.startswith("BUY"):            self.buy(*message.split(' ', 2)[1:])        elif message.startswith("SELL"):            self.sell(*message.split(' ', 2)[1:])    def run(self):        self.bus.start()        self.bus.block(interval=0.01)                def stop(self):        self.queue.put("stop")    def buy(self, code, amount):        self.bus.log("BUY order placed for %s %s" % (amount, code))    def sell(self, code, amount):        self.bus.log("SELL order placed for %s %s" % (amount, code))class Bank(object):    def __init__(self, queue):        self.bus = MyBus(Bank.__name__)        self.queue = queue        self.bus.subscribe("main", self.randomly_place_order)        self.bus.subscribe("exit", self.terminate)    def randomly_place_order(self):        order = random.sample(['BUY', 'SELL'], 1)[0]        code = random.sample(string.ascii_uppercase, 4)        amount = random.randint(0, 100)        message = "%s %s %d" % (order, ''.join(code), amount)        self.bus.log("Placing order: %s" % message)                self.queue.put(message)    def run(self):        self.bus.start()        self.bus.block(interval=0.01)    def terminate(self):        self.bus.unsubscribe("main", self.randomly_place_order)        self.bus.unsubscribe("exit", self.terminate)if __name__ == '__main__':    queue = Queue()        broker = Broker(queue)    broker.start()    bank = Bank(queue)    bank.run()