Digamos que tengo una función que escribe en un archivo. También tengo una función que itera repetidamente leyendo desde dicho archivo. Tengo ambas funciones ejecutándose en hilos separados. (En realidad estoy leyendo/escribiendo en registros a través de MDIO, por lo que no puedo tener ambos hilos ejecutándose simultáneamente, solo uno o el otro, pero por simplicidad, digamos que es un archivo)Python: threading + lock ralentiza mi aplicación considerablemente
Ahora cuando Ejecuto la función de escritura de forma aislada, se ejecuta bastante rápido. Sin embargo, cuando estoy ejecutando un enhebrado y obtengo un bloqueo antes de ejecutarlo, parece que funciona extremadamente lento. ¿Esto es porque el segundo hilo (función de lectura) está sondeando para adquirir el bloqueo? ¿Hay alguna forma de evitar esto?
Actualmente estoy usando un RLock simple, pero estoy abierto a cualquier cambio que aumente el rendimiento.
Editar: Como ejemplo, voy a poner un ejemplo básico de lo que está sucediendo. El hilo de lectura básicamente se está ejecutando, pero de vez en cuando un hilo separado hará una llamada para cargar. Si comparo ejecutando load desde cmd prompt, ejecutar en un thread es al menos 3 veces más lento.
hilo de escritura:
import usbmpC# functions I made which access dll functions for hardware, etc
def load(self, lock):
lock.acquire()
f = open('file.txt','r')
data = f.readlines()
for x in data:
usbmpc.write(x)
lock.release()
lectura hilo:
import usbmpc
def read(self, lock):
addr = START_ADDR
while True:
lock.acquire()
data = usbmpc.read(addr)
lock.release()
addr += 4
if addr > BUF_SIZE: addr = START_ADDR
En CPython, excluyendo el módulo C (externo) liberador de GIL, solo hay un hilo que se "ejecuta" a la vez ya que solo un hilo tiene permiso para acceder al motor Python a la vez. Si la llamada MDIO no libera el GIL, la otra función/bloqueo * ni siquiera puede iniciarse * (es decir, el código Python no se ejecutará) hasta que se complete la llamada MDIO. (No conozco el modo MDIO que tiene hilos). –
Edité la publicación con un ejemplo. ¿Estás diciendo que una vez que el hilo de escritura adquiere el bloqueo, el hilo de lectura nunca se ejecutará? Estaba bajo la cerradura de la impresión. ¿Comprará la encuesta hasta que adquiera la cerradura? ¿Qué otra cosa podría estar ralentizando el código anterior? –
@Shaunak Amin No estaba tratando de decir/insinuar que :-) Pero el enhebrado CPython no puede ejecutar múltiples hilos de Python al mismo tiempo (se enclavan internamente en el GIL, solo algunas instrucciones permiten que un hilo de Python "ceda" ") - pero esto no se aplica realmente con la actualización anterior ya que los bloqueos son sobre el acceso usbmpc. –