@staticmethod
def compare_chunk_contents(chunks1, chunks2):
    """Compare two chunk iterators (like returned by :meth:`.DownloadPipeline.fetch_many`)"""
    end = object()
    alen = ai = 0
    blen = bi = 0
    while True:
        if not alen - ai:
            a = next(chunks1, end)
            if a is end:
                return not blen - bi and next(chunks2, end) is end
            a = memoryview(a)
            alen = len(a)
            ai = 0
        if not blen - bi:
            b = next(chunks2, end)
            if b is end:
                return not alen - ai and next(chunks1, end) is end
            b = memoryview(b)
            blen = len(b)
            bi = 0
        slicelen = min(alen - ai, blen - bi)
        if a[ai:ai + slicelen] != b[bi:bi + slicelen]:
            return False
        ai += slicelen
        bi += slicelen
