Je n'arrive pas à comprendre comment fonctionnent les files d'attente de marque haute mer (HWM) ZeroMQ.Comprendre le HWM de ZMQ
J'ai joint deux scripts ci-dessous, qui reproduisent ce qui suit.
- tablir une connexion PUSH/PULL, réglage toutes les files d'attente à la taille HWM 1.
- Faire le sommeil Extracteur un certain temps.
- Envoie 2200 messages depuis le poussoir.
- Lorsque l'extracteur se réveille, recevez les 2200 messages et imprimez-les.
Le résultat obtenu est que l'extracteur est capable de recevoir (imprimer) tous les messages avec succès. En outre, le pousseur semble terminer l'exécution presque instantanément. Selon le ZMQ official documentation ce que je m'attendais de ce que le pousseur est de ne pas finir l'exécution avant que l'extracteur se réveille, en raison d'être bloqué sur le deuxième appel send(...)
dû au HWM étant atteint. J'ai également essayé d'ajouter un sommeil de 0.001 seconde entre chaque appel send(...)
, même résultat.
Alors, mes questions sont les suivantes:
- Pourquoi poussoir ne bloque pas dans le second appel à
send(...)
, après la HWM est atteinte (taille 1)? - Où les messages sont-ils stockés à la fois dans le poussoir et dans l'extracteur?
- Existe-t-il une relation directe entre la taille HWM et le nombre de messages stockés?
Scripts:
pusher.py
import zmq
context = zmq.Context()
push_socket = context.socket(zmq.PUSH)
push_socket.setsockopt(zmq.SNDHWM, 1)
push_socket.setsockopt(zmq.RCVHWM, 1)
push_socket.bind("tcp://127.0.0.1:5557")
print(push_socket.get_hwm()) # Prints 1
print('Sending all messages')
for i in range(2200):
push_socket.send(str(i).encode('ascii'))
print('Finished execution...')
puller.py
import zmq
import time
context = zmq.Context()
pull_socket = context.socket(zmq.PULL)
pull_socket.setsockopt(zmq.RCVHWM, 1)
pull_socket.setsockopt(zmq.SNDHWM, 1)
pull_socket.connect("tcp://127.0.0.1:5557")
print(pull_socket.get_hwm()) # Prints 1
print('Connected, but not receiving yet... (Sleep 4s)')
time.sleep(4)
print('Receiving everything now!')
rec = ''
for i in range(2200):
rec += '{} '.format(pull_socket.recv().decode('ascii'))
print(rec) # Prints `0 1 2 ... 2198 2199 `
Afin de reproduire mon cas de test, ouvert deux terminaux et lancer le premier puller.py en un et rapidement après (fenêtre de 4 secondes) pusher.py dans l'autre.
Merci pour la réponse! Je n'avais aucune idée sur les tampons OS ... Je vais faire quelques recherches à leur sujet. – Guimo