2014-04-04 15 views
5

Có cách tích hợp hoặc chuẩn mực để tiêu thụ kết quả đầu tiên và tất cả liên tiếp cho một cuộc gọi ndb.get_multi_async theo thứ tự hoàn thành của chúng không?ndb aysnc "sản lượng tiếp theo" để tiêu thụ get_multi_async

tôi mong đợi, và điều này cho thấy, nó dọc theo dòng:

def yield_next(futures): 
    while futures: 
    yield ndb.Future.wait_any(futures) 
    # We have to remove the yielded future from the futures. 
    # How do we know which future was removed? 
    # ... futures.remove(???) 

for model in yield_next(ndb.get_multi_async(keys)): 
    ... 

Một cách để loại bỏ tương lai tiêu thụ là để kiểm tra futures để xem liệu nó được thực hiện. Có điều kiện chủng tộc vốn có: Nếu bất kỳ tương lai nào hoàn thành đồng thời hoặc trong mọi trường hợp trước khi gọi remove, nhiều yếu tố của futures có thể là được thực hiện. Tôi không nhận thức được một cách đáng tin cậy để xác định tương lai nào đã được tiêu thụ.

Người ta cho rằng đây là một mẫu khá phổ biến, nhưng tôi chưa thấy nó được giải quyết. Nhìn qua ndb/tasklets.py dường như có một số khả năng kỳ lạ (đọc: không có giấy tờ) như ReducingFuture hoặc MultiFuture, nhưng tôi chưa bao giờ sử dụng chúng. Có lẽ câu trả lời nằm ở các tasklet.

Trả lời

7

Thật dễ dàng - chỉ cần sử dụng bộ:

futures = set(futures) 
while futures: 
    f = ndb.Future.wait_any(futures) 
    futures.remove(f) 
    yield f 
Các vấn đề liên quan