break dans une boucle for
Voici la méthode d'une classe héritée de threading.Thread. Cette méthode est appelée dans un for de la méthode run() asynchrone.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def _next_timestamp(self) -> Fraction:
"""Return the next timestamp to be decoded."""
while True:
for timestamp in sorted(set(map(Fraction, self._predictor.predict(PRED_BUFFER)))):
print("timestamp predit", timestamp)
if self._stop_flag:
return StopIteration
try:
yield self._queues["request"].get_nowait()
print("break")
break # if a new timestamp in the predictor, reset the prediction
except queue.Empty:
if timestamp not in self._frames:
print(timestamp, "n'est pas dans la queue")
yield timestamp
else:
print(timestamp, "deja dans la queue")
else:
print("prediction terminee")
yield self._queues["request"].get() |
Bon, ou est le problème me diriez vous? Et bien voici ce qui se passe quand on l'appelle:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| >>> frame_anticipator = FrameAnticipator(video, 0, {})
>>>
>>> timestamp predit 0
0 n'est pas dans la queue
prediction terminee
>>> frame_anticipator.snapshot(Fraction(0))
<av.VideoFrame, pts=0 yuv420p 1280x720 at 0x71ef653cbbe0>
>>> frame_anticipator.snapshot(Fraction(1))
<av.VideoFrame, pts=968 yuv420p 1280x720 at 0x71ef653cbc40>
>>> timestamp predit 0
0 deja dans la queue
prediction terminee
>>> frame_anticipator.snapshot(Fraction(2))
<av.VideoFrame, pts=1969 yuv420p 1280x720 at 0x71ef653cb400>
>>> |
Jusque-là, le comportement est tout à fait attendu. Mais voyez ce que le code continue à m'afficher à l'infini juste après :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| timestamp predit 4
4 n'est pas dans la queue
timestamp predit 8
8 n'est pas dans la queue
timestamp predit 562949953421313/35184372088832
562949953421313/35184372088832 n'est pas dans la queue
timestamp predit 4
4 deja dans la queue
timestamp predit 8
8 deja dans la queue
timestamp predit 562949953421313/35184372088832
562949953421313/35184372088832 n'est pas dans la queue
timestamp predit 4
4 deja dans la queue
timestamp predit 8
8 deja dans la queue
timestamp predit 562949953421313/35184372088832
562949953421313/35184372088832 n'est pas dans la queue
timestamp predit 4
4 deja dans la queue
... |
Et cela a l'infinie !
Pourquoi diable n'entre-t-il pas dans le else du for, alors que break n'est jamais atteint !?:arf: