python队列只能一个个读取吗_从Python队列中读取行

这对于发电机来说可能是一个很好的用途。它会在产量之后准确地从它停止的位置获取,因此减少了您需要的存储量和缓冲区交换量(我不能说它的性能)。

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值