¿Está sincronizada la impresión de python?

¿Está sincronizada la impresión de python? 🙂

Entre los hilos.

La impresión de Python no es ni vagamente segura para hilos . (Palabras de Bram Cohen, no mías).

Si llama a la print desde varios subprocesos, la salida se puede intercalar en el capricho del progtwigdor.

La respuesta es no, los hilos pueden interrumpirse unos a otros. Sin embargo, puedes usar cerraduras para evitar eso.

los hilos de locking evitan que los hilos se interrumpan entre sí en las cosas globales (específicamente aquí en la pantalla de salida) cuando un hilo quiere usar una cosa global con un locking, primero verifica si el locking está desbloqueado, si no espera hasta que lo está, luego se bloquea La cerradura, haga lo que quiera hacer con lo global, y finalmente libere la cerradura.

Sin embargo, no solo utilice las variables de marca y, si se comprueba para implementar esto, los subprocesos pueden cambiar entre la instrucción if y el locking. Python implementa una clase de locking, si recuerdo correctamente su threading.lock.

Además, tenga en cuenta que puede ejecutar un interlocking o un locking vital si no utiliza los lockings correctamente. No tengo mucho tiempo ahora, así que realmente no puedo explicar todo eso aquí, pero puedes buscar en Google para obtener más información. También verifico si puedo compartir las presentaciones de mi curso de la universidad del año pasado. bien ahí dentro

Tipo de solución … No se imprime sincronizado, pero es monolítico y, por lo tanto, los hilos no se escriben uno encima del otro.

Pros: No requiere locking y por lo tanto es más rápido.

Contras:

  • No está sincronizado y no hay garantía de que los eventos se imprimirán en el orden en que se realizaron. Como efecto secundario, si aparece una excepción, el texto de la excepción puede comenzar antes de que salgan las últimas impresiones. Pueden aparecer después del texto de excepción o en algún lugar en medio de la traza de la stack.
  • Toma un poco más de tiempo y memoria para ejecutar el bucle.
 import threading, time class SomeThread(threading.Thread): def __init__(self, name): super().__init__() self.name = name ... def mono_print(self, *v): p = time.strftime("%Y-%m-%d %H:%M:%S") + ' ' + self.name for s in v: p += ' ' + str(s) print(p + '\n', end='', flush=True) def run(self): self.mono_print('thread is running.') ... self.mono_print('something', 'them something else') ... self.mono_print('processed')