Ho bisogno di scrivere una semplice applicazione che gestisce due thread: - filettatura 1: viene eseguito in periodi cronometrati, diciamo ogni 1 minuto - filo 2: solo un 'normale', mentre Vero ciclo che fa 'roba'Thread in twisted ... come usarli correttamente?
se non l'obbligo di funzionare a intervallo di tempo non avrei guardato contorto a tutti, ma semplice sonno (60) non è abbastanza buono e la costruzione come:
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
sembrava davvero semplice per ottenere quello che volevo lì .
Ora, come si aggiunge "correttamente" un altro thread?
vedo due opzioni qui:
- Usa libreria di threading ed eseguire una due 'pitone discussioni' esecuzione di mio ciclo while, e un altro reactor.run esecuzione(). Ma Google sembra opporsi a questo approccio e suggerisce di utilizzare il threading attorcigliato
- Utilizzare threading attorcigliato. Questo è quello che ho provato, ma in qualche modo questo mi sembra un po 'maldestro.
Ecco cosa mi è venuta:
def timed_thread():
print 'i will be called every 1 minute'
return
def normal_thread():
print 'this is a normal thread'
time.sleep(30)
return
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.callInThread(normal_thread)
reactor.run()
che sembra funzionare, ma! Non riesco a fermare l'app. Se premo^C non farebbe nulla (senza 'callInThread' si arresta esattamente come ci si aspetterebbe che sia).^Z bombe verso la shell, e se poi faccio 'kill% 1' sembra che uccida il processo (la shell riporta che), ma il thread 'normale' continua a girare. uccidere PID non se ne libererebbe, e l'unica cura è uccidere -9. Veramente strano.
Così. Che cosa sto facendo di sbagliato? È un approccio corretto implementare due thread in twisted? Non dovrei preoccuparmi di contorcersi? Quali altre alternative "standard" devono implementare le chiamate programmate? ('Standard' Voglio dire che posso installarlo facilmente o installarlo, non voglio iniziare a scaricare e usare script casuali da pagine web casuali).
Si utilizzano i thread in twistato (e in python in generale) con molta attenzione. Cosa sta facendo il tuo "main"? Un caso d'uso frequente per twisted è come un protocollo client/server, facendo richieste o ascoltando richieste. Il reattore gestirà tali richieste e, supponendo che non siano bloccanti, sarà in grado di attivare una determinata funzione in un determinato intervallo di tempo. – MattH
Il pericolo con i thread è che se non si fa attenzione, un thread potrebbe modificare i dati mentre viene utilizzato da un altro thread che causa un comportamento imprevedibile. – MattH
tutto ciò che "main" è pensato per fare è solo sparare a questi due thread (in realtà sono solo 4 linee come si può vedere nell'esempio), entrambe le funzioni sono un po 'più elaborate ma nulla di insolito in termini di elaborazione dell'altro lo ispeziona semplicemente , ma questo non ha molta importanza). questi due thread non condividono alcun dato btw – rytis