Перебирать список и удалять их элементы несколько раз - PullRequest
1 голос
/ 11 апреля 2020

У меня есть следующий скрипт в Python, каждые 30 секунд проверяет все задачи в списке, когда задача выполнена (СБОЙ, ОТМЕНА или ЗАВЕРШЕНА), задача удаляется из исходной задачи, а затем будет отслеживать опять другие задачи. Код работает хорошо таким образом.

Проблема в том, что я не уверен, что каждая итерация в то время как l oop создает новый список, потому что весь процесс может занять несколько часов, поэтому я не хочу создавать ненужные данные в памяти.

def download():
    while tasks:

        for task in tasks[:]:
            success = 0
            file_name = task[1]
            task_index = tasks.index(task)
            task_state = ee.data.getTaskStatus(task[0])[0]['state']

            print(task, task_state)

            if  task_state == FAILED:
                tasks.remove(tasks[task_index])

            elif task_state in [CANCEL_REQUESTED, CANCELLED]:
                tasks.remove(tasks[task_index])

            elif task_state == COMPLETED:
                tasks.remove(tasks[task_index])
                success = 1

            if success == 1:

                do_something()

        if tasks:
            time.sleep(30)
        else:
            print('Done!')
download()

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

код, который вы показываете, не создает другой список, также вы можете немного улучшить:

to_remove_states = {CANCEL_REQUESTED, CANCELLED, FAILED, COMPLETED}

def my_filter(taks):
    state = ee.data.getTaskStatus(task[0])[0]['state']
    if state in to_remove_states:
        if state == COMPLETED:
            do_something()   # should not be dependent on your tasks form download function
        return False
    return True

def download():
    while tasks:
        time.sleep(30)
        tasks  = list(filter(my_filter, tasks))
    print('Done!')

download()
1 голос
/ 11 апреля 2020

В вашем коде нет нового списка. Но, возможно, вы захотите немного его сократить:

def download():
while tasks:

    for task in tasks[:]:
        success = 0
        file_name = task[1]
        task_index = tasks.index(task)
        task_state = ee.data.getTaskStatus(task[0])[0]['state']

        print(task, task_state)

        if task_state in [CANCEL_REQUESTED, CANCELLED, FAILED, COMPLETED]:
            tasks.remove(tasks[task_index])
        if task_state == COMPLETED:
            do_something()

    if tasks:
        time.sleep(30)
    else:
        print('Done!')
download()

Я думаю, этот код подходит для go;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...