Ho una serie di "attività" che vorrei eseguire in thread separati. Le attività devono essere eseguite da moduli separati. Ciascuno contiene la logica di business per l'elaborazione dei propri compiti.Creazione di una discussione in python
Data una tupla di attività, mi piacerebbe essere in grado di generare un nuovo thread per ciascun modulo come segue.
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)
Nessun premio per indovinare Sto ancora pensando in C++. Come posso scrivere questo in modo Python usando gli 'enum' e 'switch' di Pythonic ed essere in grado di eseguire un modulo in una nuova discussione.
Ovviamente, i moduli avranno tutti una classe derivata da un ABC (classe base astratta) chiamato Plugin. Il metodo spawnWorker() verrà dichiarato nell'interfaccia Plugin e definito nelle classi implementate nei vari moduli.
Forse, c'è un modo migliore (cioè Pythonic) per fare tutto questo ?. Sarei interessato a sapere
[Edit]
Ho appena letto un bot di più e sembra Python non implementa threading nel vero senso (almeno, non nel senso che un programmatore C++ avrebbe pensato). In ogni caso questo non è uno spettacolo per me. Ognuna delle attività richiede molto tempo e non desidero rallentare l'avvio di un'attività finché non ne è stata completata un'altra, ecco perché utilizzo la filettatura. L'affinamento del tempo non mi infastidisce molto - purché siano tutti avviati praticamente contemporaneamente (o poco dopo l'altro) Python può quindi sovrapporsi tra le pedate quanto vuole - per me va bene.
Ho visto una risposta a una domanda simile qui su SO.
Un utente fornisce una semplice classe per la filettatura come segue:
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()
Sto pensando di utilizzare questo per il mio ABC Plugin. La mia domanda allora è dove inserisco il codice in cui viene eseguito l'effettivo compito (cioè la logica aziendale). Presumo che questo vada nel metodo run() della classe Foo (ovvia domanda lo so, ma non voglio fare ipotesi).
È il mio pensiero sulla strada giusta o sbagliata (se difettoso -? Quello che ho perso)
Invece di caso di commutazione, perché non utilizzare un polimorfismo appropriato (ereditarietà ABC o digitazione anatra)? – Santa
@Santa: buon punto. Ecco come l'avrei fatto (polimorfismo) in C++. Ma non ero abbastanza sicuro se Python lo supportasse. – morpheous
@morpheous Scoprirai che, oltre al tradizionale polimorfismo basato sull'ereditarietà, Python supporta anche approcci più dinamici al polimorfismo, il più importante dei quali è la digitazione anatra. – Santa