bounty还有7天到期。回答此问题可获得+50声望奖励。user3541631希望引起更多关注此问题。
我有一个多重处理队列;通过使用SENTINEL值(一个字符串)来通知队列的结束。
aq = Queue()
........................
队列中的示例属于A类:
class A:
id: str
desc: str
在一个函数中,我从队列aq
中获取元素,并分块处理它们。第一个元素(如果只有一个)可以是SENTINEL,没有要处理的元素。
def process:
chunk_data = []
all = [
item = aq.get()
if not isinstance(item, A):
return
chunk_data.append(item.id)
while item != SENTINEL:
# start process in chunks
# adding elements to the chunk list until is full
while len(chunk_data) < CHUNK_MAX_SIZE: # 50
item = aq.get()
if item == SENTINEL:
break
chunk_data.append(item.id)
# the chunk list is full start processing
chunk_process_ids = process_data(chunk_data) # process chunks
all.extend(chunk_process_ids)
# empty chunk list and start again
chunk_data.clear()
该函数按预期工作,但我认为代码是复杂的,我正在寻找一个简单,更清晰的版本。
2条答案
按热度按时间42fyovps1#
我更倾向于将代码结构化如下:
但是对于“writer”来说,最好使用
get_chunks
,这样就可以将已经制作好的块写入队列。这将导致更少(但更大)的队列访问,这 * 通常 * 会更有效。下面是一个例子,我假设所有的
A
示例都在一个列表list_of_a_instances
中:bvuwiixz2#
为了遵循DRY principle,这里是我认为是相同逻辑的一个更干净的版本,没有代码重复。请注意,当输入值的类型不符合预期时,引发异常通常比简单地返回更好。