Tengo una serie de 'tareas' que me gustaría ejecutar en hilos separados. Las tareas deben ser realizadas por módulos separados. Cada uno contiene la lógica comercial para procesar sus tareas.Engendrando un hilo en python
Dando una tupla de tareas, me gustaría poder engendrar un nuevo hilo para cada módulo de la siguiente manera.
from foobar import alice, bob charles
data = getWorkData()
# these are enums (which I just found Python doesn't support natively) :(
tasks = (alice, bob, charles)
for task in tasks
# Ok, just found out Python doesn't have a switch - @#$%!
# yet another thing I'll need help with then ...
switch
case alice:
#spawn thread here - how ?
alice.spawnWorker(data)
No hay premios para adivinar Todavía estoy pensando en C++. ¿Cómo puedo escribir esto de una manera Pythonic usando Pythonic 'enums' y 'switch'es, y ser capaz de ejecutar un módulo en un nuevo hilo.
Obviamente, los módulos tendrán una clase que se deriva de un ABC (clase base abstracta) llamado Plugin. El método spawnWorker() se declarará en la interfaz del complemento y se definirá en las clases implementadas en los diversos módulos.
Tal vez, hay una forma mejor (es decir, pitonica) de hacer todo esto ?. Yo estaría interesado en saber
[Editar]
He estado leyendo un bot más y parece que Python no implementa roscado en el verdadero sentido (al menos, no en el sentido de que un programador de C++ pensaría). En cualquier caso, eso no es un obstáculo para mí. Cada una de las tareas lleva bastante tiempo, y no quiero retrasar el inicio de una tarea hasta que otra se haya completado, por eso estoy usando el enhebrado. Cortar el tiempo no me molesta demasiado, siempre y cuando todos se inicien casi al mismo tiempo (o poco después) Python puede hacer un ciclo de tiempo entre las huellas tanto como quiera, está bien para mí.
He visto la respuesta a una pregunta similar aquí en SO.
un usuario proporciona una clase simple para el roscado de la siguiente manera:
import threading
class Foo (threading.Thread):
def __init__(self,x):
self.__x = x
threading.Thread.__init__(self)
def run (self):
print str(self.__x)
for x in xrange(20):
Foo(x).start()
estoy pensando en usar esto para mi ABC Plugin. Mi pregunta es, entonces, ¿dónde coloco el código donde se realiza la tarea real (es decir, la lógica de negocios). Supongo que esto va en el método run() de la clase Foo (pregunta obvia que sé, pero no quiero hacer ninguna suposición).
Es mi forma de pensar en el camino correcto o defectuoso (si es defectuoso - lo que me he perdido)
En lugar de la caja del conmutador, ¿por qué no utilizar un polimorfismo apropiado (herencia ABC o tipado de pato)? – Santa
@Santa: Buen punto. Así es como lo habría hecho (polimorfismo) en C++. Pero no estaba muy seguro de si Python lo soportaba. – morpheous
@morpheous Encontrará que, además del polimorfismo tradicional basado en la herencia, Python también admite enfoques más dinámicos al polimorfismo, el más destacado de los cuales es el tipado de patos. – Santa