Diferencia entre queue.queue vs collections.deque en Python

Los comandos queue.queue y collections.deque dan una idea sobre las colas en general al lector, pero ambos tienen una aplicación muy diferente, por lo que no deben confundirse como uno solo. Aunque son diferentes y se utilizan para propósitos muy diferentes, están vinculados entre sí en términos de funcionalidad completa. Antes de pasar a lo que realmente hacen y cómo están vinculados entre sí, hay un concepto que debe revisarse, los conceptos básicos del procesamiento en el software de computadora. 

Sabemos que cualquier programa se convierte en un proceso en estado activo y cada proceso se puede dividir en subprocesos para aprovechar los beneficios de la ventaja que posee. También sabemos que dos subprocesos pueden tener que comunicarse entre sí y aquí es donde queue.queue entra en escena. Collections.deque, por otro lado, se usa como una estructura de datos dentro de un hilo para realizar ciertas funciones. El vínculo entre ellos es que queue.queue usa collections.deque internamente. Ambos tratan con operaciones seguras para subprocesos.

Queue.Queue: esta clase, como se indicó anteriormente, se usa para facilitar la comunicación entre dos subprocesos que se originan en el mismo proceso. Sin embargo, funciona como una cola típica, la única diferencia es el propósito al que sirve. Tiene todas las funciones de multirocessing.queue para hacerlo, junto con dos funciones más: task_done() y join().

  • Como sugiere el nombre, task_done() se usa para informar la finalización de la tarea
  • Join() se usa para pedir a todas las tareas que esperen hasta que todos los procesos terminen de procesarse.

Python3

# import modules
import threading, queue
  
# setting up a queue for threads
q = queue.Queue()
  
def execute_thread():
    while True:
        th=q.get()
        print(f'task {th} started')
        print(f'task {th} finished')
        q.task_done()
  
# set up for threads to work
threading.Thread(target = execute_thread,
                 daemon = True).start()
  
# sending task requests 
for i in range(5):
    q.put(i)
print("all tasks sent")
  
  
# making threads wait until all tasks are done
q.join()
print("all tasks completed")

Producción:

all tasks sent
task 0 started
task 0 finished
task 1 started
task 1 finished
task 2 started
task 2 finished
task 3 started
task 3 finished
task 4 started
task 4 finished
all tasks completed

Colecciones.Deque: Una estructura de datos general, que se comporta como una Cola FIFO regular. Esto se emplea dentro de un subproceso para realizar alguna funcionalidad. Su implementación básica se muestra a continuación:

Python3

# import module
from collections import deque
  
# initialise
dq = deque(['first','second','third'])
print(dq)
deque(['first', 'second', 'third'])
  
# adding more values
dq.append('fourth')
dq.appendleft('zeroth')
print(dq)
deque(['zeroth', 'first', 'second', 'third', 'fourth'])
  
# adding value to a specified index
dq.insert(0,'fifth')
print(dq)
deque(['fifth', 'zeroth', 'first', 'second', 'third', 'fourth'])
  
# removing values
dq.pop()
'fourth'
print(dq)
deque(['fifth', 'zeroth', 'first', 'second', 'third'])
dq.remove('zeroth')
print(dq)
deque(['fifth', 'first', 'second', 'third'])

Producción:

deque([‘primero’, ‘segundo’, ‘tercero’])
deque([‘cero’, ‘primero’, ‘segundo’, ‘tercero’, ‘cuarto’])
deque([‘quinto’, ‘cero’ , ‘primero’, ‘segundo’, ‘tercero’, ‘cuarto’])
deque([‘quinto’, ‘cero’, ‘primero’, ‘segundo’, ‘tercero’])
deque([‘quinto’, ‘ primera segunda tercera’])

Publicación traducida automáticamente

Artículo escrito por vanshikagoyal43 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *