Source code for spinnman.connections.listeners.port_listener
import threading
import logging
import traceback
from multiprocessing.pool import ThreadPool
from spinnman.connections.listeners.queuers.callback_worker import \
CallbackWorker
logger = logging.getLogger(__name__)
[docs]class PortListener(threading.Thread):
def __init__(self, callback, queuer, no_threads=5):
threading.Thread.__init__(self)
self._done = False
self._queuer = queuer
self._callbacks = list()
self._callbacks.append(callback)
self._thread_pool = ThreadPool(processes=no_threads)
self.setDaemon(True)
[docs] def register_callback(self, callback):
self._callbacks.append(callback)
[docs] def deregister_callback(self, callback):
self._callbacks.remove(callback)
[docs] def stop(self):
logger.info("[port_listener] Stopping")
self._done = True
self._queuer.stop()
[docs] def set_port(self, port):
self._queuer.set_port(port)
[docs] def run(self):
logger.info("[port_listener] starting")
self._queuer.start()
while not self._done:
try:
packet = self._queuer.get_packet()
if packet is not None:
for callback in self._callbacks:
self._thread_pool.apply_async(
CallbackWorker.call_callback,
args=[callback, packet])
except Exception:
if not self._done:
traceback.print_exc()
logger.debug("[port listener] Error in callback")