Primer contacto con la concurrencia
Muy bien, una pequeña tarea reciente me permitió adentrarme en la programación concurrente con un propósito real.
Demo
Así que, usando los módulos queue, signal y time de Python, hice un pequeño demo ilustrativo que no es realmente multihilo:
# -*- coding: utf-8 -*-
# @Author: Michale
# @Date: 2017-05-04 15:00:41
# @Last Modified by: Michale
# @Last Modified time: 2017-05-07 00:46:52
import signal
import queue
import time
class TestClass(object):
queue = queue.Queue()
def __init__(self):
signal.signal(signal.SIGINT, self.stopIfPressKill)
def stopIfPressKill(self, mySignal, stack):
if mySignal == signal.SIGINT:
print('you pressed CTRL-C')
self.queue.put_nowait('stop')
print(self.queue.qsize())
def mainThread(self):
while True:
time.sleep(1)
if not self.queue.empty():
data = self.queue.get()
print(data)
if data == 'stop':
break
else:
self.queue.put(data)
if __name__ == '__main__':
yoo = TestClass()
yoo.mainThread()
Explico la función de los tres módulos:
queue: Actúa como cola de mensajes, aunque aquí parece un poco excesivo.signal: Se usa para capturarKeyboardInterrupty luego colocar la señal de parada en la cola de mensajes.time: Permite que el hilo principal pueda capturar esteKeyboardInterrupt.
Idea
La introducción de la multihilos hace que sea difícil controlar los hilos no principales una vez iniciados, lo que obliga a usar métodos como las colas de mensajes para la comunicación entre hilos.
Pero, en realidad, independientemente de si es multihilo o no, los diferentes módulos del sistema deberían encapsular sus detalles y usar eventos para trabajar en conjunto. Esto ayuda mucho a reducir el acoplamiento del sistema, y también es un buen principio de diseño: diseñar para el cambio.