下面的方法应该行得通。import sys
for line in sys.stdin:
# whatever
理由:
代码将在stdin中的行上迭代。如果流仍处于打开状态,但没有完整的行,则循环将挂起,直到遇到换行符(并返回整行)或流关闭(并返回缓冲区中剩余的内容)。
一旦流关闭,就不能再向stdin写入或从stdin读取数据。周期。
代码导致cpu过载的原因是,一旦stdin被关闭,任何后续的遍历stdin的尝试都将立即返回,而不做任何操作。实际上,您的代码相当于以下代码。for line in sys.stdin:
# do something
while 1:
pass # infinite loop, very CPU intensive
如果你把你如何向stdin写入数据的方式公布出来,也许会有帮助。
编辑:
Python将(出于for循环的目的,迭代器和readlines()考虑在遇到EOF字符时关闭流。在此之后,您可以要求python读取更多数据,但不能使用前面的任何方法。python手册页建议使用import sys
while True:
line = sys.stdin.readline()
# do something with line
遇到EOF字符时,readline将返回空字符串。如果流仍处于打开状态,则对readline的下一个调用将正常工作。您可以通过在终端中运行命令来测试这一点。按ctrl+D将导致终端将EOF字符写入stdin。这将导致本文中的第一个程序终止,但最后一个程序将继续读取数据,直到流实际关闭。最后一个程序不应该是100%的CPU,因为readline会等到有数据返回,而不是返回空字符串。
我只有在尝试从实际文件中读取行时才遇到忙循环的问题。但当从stdin读取时,readline会愉快地阻塞。