问题 为什么我不能打破这个itertools无限循环?


在REPL中,我们通常可以用sigint中断无限循环,即 CTRL+C,并重新获得口译员的控制权。

>>> while True: pass
... 
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>>

但是在这个循环中,中断似乎被阻止了,我必须杀死父进程才能逃脱。

>>> *x, = itertools.repeat('x')
^C^C^C^C^C^C^C^C^\^\^\^\^\^Z^Z^Z^Z

这是为什么?


8745
2018-03-30 21:57


起源

Python跟踪器中的相关错误: bugs.python.org/issue26351 - Martijn Pieters♦


答案:


KeyboardInterrupt 在每条Python指令后检查。 itertools.repeat 并且元组生成在C代码中处理。之后处理中断,即从不处理。


10
2018-03-30 22:03



确实。 list(itertools.repeat('x')) 还挂了解释器,但把它放在后台并发送一个平原 TERM 信号确实正确杀死了解释器。 - Martijn Pieters♦
错误或功能? - wim
@wim:看 bugs.python.org/issue26351。 - Martijn Pieters♦
我同意。我最初认为悬挂与内存分配有关。但是内存使用量并没有增长 list(itertools.groupby(itertools.repeat(1)) 它也挂起了解释器。 - A.P.