def METHOD_NAME(
    urls_with_col_and_row, on_progress_changed: Callable = None, cancelling_func: Callable[[], bool] = None
) -> List:
    replies: List[Tuple[QNetworkReply, Tuple[int, int]]] = [
        (http_get_async(url), (col, row)) for url, col, row in urls_with_col_and_row
    ]
    total_nr_of_requests = len(replies)
    all_finished = False
    nr_finished_before = 0
    finished_tiles = set()
    nr_finished = 0
    all_results = []
    cancelling = False
    while not all_finished:
        cancelling: bool = cancelling_func and cancelling_func()
        if cancelling:
            break
        new_finished = list(filter(lambda r: r[0].isFinished() and r[1] not in finished_tiles, replies))
        nr_finished += len(new_finished)
        for reply, tile_coord in new_finished:
            finished_tiles.add(tile_coord)
            if reply.error():
                warn(
                    "Error during network request: {}, {}",
                    remove_key(reply.errorString()),
                    remove_key(reply.url().toDisplayString()),
                )
            else:
                content = reply.readAll().data()
                all_results.append((tile_coord, content))
            reply.deleteLater()
        QApplication.processEvents()
        all_finished = nr_finished == total_nr_of_requests
        if nr_finished != nr_finished_before:
            nr_finished_before = nr_finished
            if on_progress_changed:
                on_progress_changed(nr_finished)
    if not all_finished and cancelling:
        unfinished_requests = [reply for reply, tile_coord in replies if not reply.isFinished]
        for r in unfinished_requests:
            r.abort()
    if cancelling:
        all_results = []
    return all_results