Soy nuevo en la cola y los subprocesos. Por favor, ayúdeme con el siguiente código. Aquí estoy tratando de ejecutar la función hd . Necesito ejecutar la función varias veces, pero solo después de que se haya completado una sola ejecución.
import queue import threading import time fifo_queue = queue.Queue() def hd(): print("hi") time.sleep(1) print("done") for i in range(3): cc = threading.Thread(target=hd) fifo_queue.put(cc) cc.start()Salida de corriente
hi hi hi donedonedoneRendimiento esperado
hi done hi done hi donePuede utilizar un semáforo para sus propósitos
Un semáforo gestiona un contador interno que se reduce con cada llamada de adquisición () y se incrementa con cada llamada de liberación (). El contador nunca puede ir por debajo de cero; cuando adquirir() encuentra que es cero, se bloquea, esperando hasta que algún otro subproceso llame a release().
Un valor predeterminado de Semaphore es 1 ,
subprocesamiento de clase. Semáforo (valor = 1)
por lo que solo un hilo estaría activo a la vez:
import queue import threading import time fifo_queue = queue.Queue() semaphore = threading.Semaphore() def hd(): with semaphore: print("hi") time.sleep(1) print("done") for i in range(3): cc = threading.Thread(target=hd) fifo_queue.put(cc) cc.start() hi done hi done hi doneComo @user2357112supportsMonica mencionó en los comentarios, RLock sería una opción más segura
clase threading.RLock
Esta clase implementa objetos de bloqueo reentrantes. Un bloqueo reentrante debe ser liberado por el subproceso que lo adquirió . Una vez que un subproceso ha adquirido un bloqueo de reentrada, el mismo subproceso puede adquirirlo nuevamente sin bloquear; el hilo debe soltarlo una vez por cada vez que lo haya adquirido.
import queue import threading import time fifo_queue = queue.Queue() lock = threading.RLock() def hd(): with lock: print("hi") time.sleep(1) print("done") for i in range(3): cc = threading.Thread(target=hd) fifo_queue.put(cc) cc.start()por favor, ponga la impresión ("abajo") antes de dormir. funcionará bien. Motivo: su programa hará esto: thread1
: imprimir
dormir
print pero mientras el subproceso está durmiendo, otros subprocesos estarán trabajando e imprimiendo su primer comando. a mi modo, el subproceso escribirá el primero, escribirá el segundo y luego se irá a dormir y esperará a que aparezcan otros subprocesos.