Tengo que escribir una aplicación sencilla que se ejecuta dos hilos: - Hilo de 1: se ejecuta a intervalos cronometrados, digamos cada 1 minuto - rosca 2: sólo un 'normal' while True bucle que hace 'cosas'Hilos en espiral ... ¿cómo usarlos correctamente?
si no el requisito de circular a intervalo de tiempo no habría mirado trenzado en absoluto, pero el sueño sencillo (60) no es lo suficientemente bueno y construcción como:
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
se veía muy fácil de lograr lo que quería allí .
Ahora, ¿cómo 'adecuadamente' agrego otro hilo?
veo dos opciones aquí:
- uso de la biblioteca roscado y ejecutar uno de dos hilos '' pitón ejecutar mi bucle while, y otro reactor.run correr(). Pero Google parece oponerse a este enfoque y sugiere el uso de roscado trenzado
- Utilice roscado trenzado. Eso es lo que he intentado, pero de alguna manera esto me parece un poco torpe.
Esto es lo que ocurrió:
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()
que parece funcionar, pero! No puedo detener la aplicación Si presiono^C no haría nada (sin 'callInThread' simplemente se detiene como lo esperaría).^Z bombardea a shell, y si hago 'kill% 1' parece matar el proceso (el shell lo informa), pero el hilo 'normal' sigue en ejecución. kill PID no se desharía de él, y la única cura es kill -9. Muy extraño.
So. ¿Qué estoy haciendo mal? ¿Es un enfoque correcto implementar dos hilos en twisted? ¿No debería molestarme con retorcer? ¿Qué otras alternativas 'estándares' son para implementar llamadas temporizadas? ('Estándar' quiero decir que puedo instalar easy_ o instalarlos, no quiero comenzar a descargar y usar algunos scripts aleatorios de páginas web aleatorias).
Utiliza hilos en retorcido (y en python en general) con mucho cuidado. ¿Qué está haciendo tu "principal"? Un caso de uso frecuente para twisted es como un cliente/servidor de protocolo, realizando solicitudes o escuchando solicitudes. El reactor manejará esas solicitudes y, suponiendo que no sean bloqueantes, podrá disparar una función particular en un intervalo de tiempo particular. – MattH
El peligro con los subprocesos es que si no tiene cuidado, un subproceso podría modificar los datos mientras está siendo utilizado por otro subproceso que causa un comportamiento impredecible. – MattH
todo lo que se debe hacer es disparar estos dos hilos (de hecho son solo 4 líneas como se puede ver en la muestra), ambas funciones son un poco más elaboradas pero nada inusual en términos de procesamiento, otra solo lo inspecciona , pero eso realmente no importa). estos dos hilos no están compartiendo ningún dato por debajo de – rytis