这对于发电机来说可能是一个很好的用途。它会在产量之后准确地从它停止的位置获取,因此减少了您需要的存储量和缓冲区交换量(我不能说它的性能)。
def getLineGenerator(queue, splitOn):
return_buffer = []
while True:
rcv_data = queue.get(block=True) # We can pull any number of characters here.
for c in rcv_data:
return_buffer.append(c)
if c == splitOn:
yield return_buffer
return_buffer = []
gen = getLineGenerator(myQueue, "\n")
for line in gen:
print line.strip()编辑:
一旦J.F. Sebastian指出行分隔符可能是多字符的,我也必须解决这个问题。我也从jdi的答案中使用了StringIO。我再说不出效率,但我相信它在所有情况下都是正确的(至少是我能想到的)。这是未经测试的,因此可能需要进行一些调整才能实际运行。感谢J.F. Sebastian和jdi的答案,最终导致了这一点。
def getlines(chunks, splitOn="\n"):
r_buffer = StringIO()
for chunk in chunks
r_buffer.write(chunk)
pos = r_buffer.getvalue().find(splitOn) # can't use rfind see the next comment
while pos != -1: # A single chunk may have more than one separator
line = r_buffer.getvalue()[:pos + len(splitOn)]
yield line
rest = r_buffer.getvalue().split(splitOn, 1)[1]
r_buffer.seek(0)
r_buffer.truncate()
r_buffer.write(rest)
pos = rest.find(splitOn) # rest and r_buffer are equivalent at this point. Use rest to avoid an extra call to getvalue
line = r_buffer.getvalue();
r_buffer.close() # just for completeness
yield line # whatever is left over.
for line in getlines(iter(queue.get, None)): # break on queue.put(None)
process(line)