2009-06-09 9 views
5

tengo algunas preguntas acerca de temas en Python y Java ...Temas en Java y Python

  1. ¿Es posible dar prioridad a las discusiones de Python, ya que es en Java?
  2. ¿Cómo puedo matar, detener, suspender e interrumpir el hilo en Python?
  3. Grupos de hilos: ¿para qué son realmente? ¿Python también los admite?
  4. Sincronización: en Java utilizamos palabras clave simplemente sincronizadas para un método, objeto ... ¿Qué pasa con Python?

Tnx!

Respuesta

12

Suponiendo que estamos hablando de la clásica (CPython) aplicación:

  1. no, no hay prioridades en las discusiones de Python
  2. no se puede hacer ninguna de estas cosas a un hilo en Python
  3. no hay grupos de subprocesos en Python
  4. puede usar muchos enfoques, como bloqueos, pero el enfoque recomendado generalmente es utilizar el módulo Queue de la biblioteca estándar (y limitar las interacciones de sus hilos a lo que Queue le permite programar)

En otras palabras, los subprocesos de Python son mucho menos ricos que los de Java, sin mencionar que solo un subproceso por proceso puede ejecutar código Python (otros pueden ejecutar código C o esperar).

algo elegante, es decir, algo más allá de las capacidades de roscado limitadas de Python, se recomienda que utilice el módulo multiprocessing de la librería estándar - o pasar a utilizar implementaciones de Python que le permite utilizar enfoques de roscado más ricos, como Jython para la JVM o IronPython para .NET.

0

Apenas un paso lateral sobre el punto 1 aquí, porque las prioridades del subproceso Java podrían no funcionar como uno esperaría.

De la guía SCJP:

Dado que el comportamiento de prioridad de hilo de programación no está garantizada, las prioridades de uso de hilo como una forma de mejorar la eficiencia de su programa, pero sólo asegúrese de que su programa no depende de ese comportamiento para la corrección.

1

No se puede contar con las prioridades habituales de los hilos de java. Puede encontrar un subproceso de menor prioridad en ejecución cuando un subproceso de prioridad más alta está listo y en espera.

Hay algo llamado "java en tiempo real" (ver http://www.rtsj.org) que impone la prioridad de subprocesos, al menos para la clase RealtimeThread. El java.lang.Thread regular aún no puede imponer el orden de prioridad verdadero.

0

Desafortunadamente, el paquete de Python estándar tiene algo llamado GIL, o bloqueo de intérprete global. Esto significa que solo uno de tus subprocesos se ejecutará alguna vez. Dicho esto, las aplicaciones simples multiproceso son posibles y bastante fáciles de escribir. El módulo de subprocesamiento contiene primitivas de sincronización básicas como mutexes, sempahores, etc.

También hay una declaración impresionante que automatiza la mayoría de los aspectos de los usos de bloqueo.Por ejemplo:

import threading 
myLock = threading.Lock() 

entonces para usar el bloqueo:

with myLock: 
    #lock has now been acquired 
    print "I have the lock and can now to fun stuff" 
print "The lock has been released" 
+0

es GIL no ** desafortunado **. Con él, el código corre más rápido, por lo que es algo bueno. – nosklo

+0

@nosklo: en realidad, si tiene una máquina multinúcleo, el GIL hace que algunas cosas sean más lentas. Consulte http://us.pycon.org/2010/conference/schedule/event/P82/ – yarmiganosca

+0

@yarmiganosca: solo si escribe código de subproceso pesado y mezcla IO con subprocesos intensivos en CPU, que no es un patrón común . Para la mayoría de los casos de uso real y casi todos los programas de la vida real, el GIL es muy bueno y mejora la velocidad. – nosklo

1

me sentí la necesidad de desenmascarar los mitos comunes perpetuado aquí:

¿Es posible dar prioridad a Python hilos, como lo es en Java?

No en el sentido OS. Pero puede usar la multitarea cooperativa y su propio programador personalizado para asegurarse de que ciertos subprocesos usen más tiempo. También puede establecer las fracciones de tiempo entre un hilo con esto:

http://docs.python.org/library/sys.html#sys.setcheckinterval

¿Cómo puede matar I, detener, suspender e interrumpir el hilo en Python?

Tenga en cuenta que puede hacerlo. Es simplemente difícil, y la gente se pondrá filosófica sobre cómo es el mal. Pero esto es cierto en cualquier idioma. También se puede usar la siguiente función API:

http://docs.python.org/c-api/init.html#PyThreadState_SetAsyncExc

O puede utilizar su sistema operativo subyacente, como TerminateThread en las ventanas de la TID. Solo asegúrate de adquirir el bloqueo global.

Grupos de hilos: ¿para qué sirven realmente? ¿Python también los admite?

No lo creo así. Son para controlar grupos de hilos.

Sincronización: en Java utilizamos simplemente la palabra clave sincronizada para un método, objeto ... ¿Qué pasa con Python?

Lea el hilo y el módulo de roscado.

1

aquí es un ejemplo de cómo permito que mis hilos que ser detenido (sólo funciona para las discusiones dentro de los bucles de verdad, a menos que quiera colocar un if "self.alive" antes de cada línea):

import threading, Queue 

class HaltableThread(object.Thread): 
    def __init__(self): 
     self.stringQueue = Queue.Queue() 
     self.alive = True 
    def run(self): 
     while self.alive: 
      try: 
       data = self.stringQueue.read(0.01) #100ms block until data 
      except Queue.Empty: 
       pass 
      else: 
       print data 
    def stop(self): 
     self.alive = False