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 capturar KeyboardInterrupt y luego colocar la señal de parada en la cola de mensajes.
  • time: Permite que el hilo principal pueda capturar este KeyboardInterrupt.

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.

/python/ /concurrencia/