10エントリのチャンクを取得してリストに入れる必要があるキューがあり、それをさらに処理します。以下のコードは機能します(「さらに処理された」は、この例では、リストを出力するだけです)。
import multiprocessing
# this is an example of the actual queue
q = multiprocessing.Queue()
for i in range(22):
q.put(i)
q.put("END")
counter = 0
mylist = list()
while True:
v = q.get()
if v == "END":
# outputs the incomplete (< 10 elements) list
print(mylist)
break
else:
mylist.append(v)
counter += 1
if counter % 10 == 0:
print(mylist)
# empty the list
mylist = list()
# this outputs
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# [20, 21]
このコードは醜いです。私はそれを改善する方法がわかりません-私は少し前に歩哨で使用iter
する方法を読みましたが、私の問題がそれをどのように利用できるかわかりません。
問題を解決するためのより良い(=よりエレガント/パイソンの)方法はありますか?
iter
2回使用できます。が返されるiter(q.get, 'END')
までキュー内の値を反復処理できるイテレータを返します。'END'
q.get()
次に、ハタのレシピを使用できます
iter(lambda: list(IT.islice(iterator, 10)), [])
イテレータを10項目のチャンクにグループ化します。
import itertools as IT
import multiprocessing as mp
q = mp.Queue()
for i in range(22):
q.put(i)
q.put("END")
iterator = iter(q.get, 'END')
for chunk in iter(lambda: list(IT.islice(iterator, 10)), []):
print(chunk)
収量
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加