2009-06-24 33 views

Respuesta

7

Muchos programadores tratan de evitar el código multi-hilo, ya que es altamente error propenso en la programación imperativa.

Si desea realizar una tarea programada en un entorno de subproceso único, es probable que necesite algún tipo de "Reactor". Es posible que desee utilizar uno ya preparado como Twisted.

entonces sería una función básica proporcionada por el reactor, por ejemplo (con pygame):

pygame.time.set_timer - crear repetidamente un evento en la cola de eventos

+5

"Muchos programadores intentan evitar el código de subprocesos múltiples, ya que es altamente propenso a errores en la programación imperativa." Un poco fuera de tema, pero no creo que esta sea una buena razón para evitar los subprocesos múltiples. La clave es hacerlo correctamente y comprender la consistencia de la memoria y la semántica de bloqueo por completo. Estoy de acuerdo en que los programadores con experiencia limitada en este tipo de programación deben invertir mucho en el aprendizaje y la práctica antes de emplear tales técnicas en el código de producción. Evitarlo en la era de la programación multinúcleo no es realmente una opción viable si desea utilizar sus recursos por completo. – Scruffers

+3

@Scruffers multi-threaded es increíblemente difícil de corregir (y puede ser simplemente [difícil de solucionar]) (http://stackoverflow.com/questions/3830347/can-a-multi-threaded-program-ever-be-deterministic)), y hay muchas otras maneras de usar múltiples núcleos más allá de los hilos – dbr

2

Python tiene una clase de temporizador en el módulo de subprocesamiento, pero ese es un temporizador de una sola toma, por lo que sería mejor hacer algo como lo han visto los enlaces. http://code.activestate.com/recipes/65222/

¿Por qué crees que es feo, una vez que hayas escrito tal uso de clase será tan simple como en java.

si lo está utilizando dentro de alguna GUI, p. wxPython de lo que tiene wx.Timer que puede usar directamente

7

No hay respuesta directa a la pregunta.

En el sistema operativo Linux/Unix hay pocas maneras de hacerlo y por lo general me acaba de escribir mi programa/script normalmente y luego añadirlo a cron o algo similar (como launchd en OS X)

respuesta a la la pregunta comienza aquí.

Utilice el módulo python sched estándar - standard library documentation describe algunas soluciones ingeniosas.

+3

+1: Usar cron - funciona. –

+1

Si utiliza alguna solución "en Python", debe preocuparse por mantener el script en ejecución (después de reinicios, bloqueos, etc.), cron elimina la necesidad de esto, y es muy simple y confiable. – dbr

7

prueba el módulo multiprocessing.

from multiprocessing import Process 
import time 

def doWork(): 
    while True: 
     print "working...." 
     time.sleep(10) 



if __name__ == "__main__": 
    p = Process(target=doWork) 
    p.start() 

    while True: 
     time.sleep(60) 
Cuestiones relacionadas