Временно удалить элемент из списка - PullRequest
0 голосов
/ 07 января 2020

Я хочу временно удалить элемент из списка и добавить его обратно через x часов. sleep не вариант для меня, так как я хочу, чтобы код продолжал работать и не останавливался.

Будучи новичком в Python, я играю с потоками и могу заставить его работать с парой незначительные ошибки.

PS Причина, по которой я хочу удалить элемент из списка на x часов, заключается в следующем; Я получаю floodError после добавления x количества пользователей в группу при использовании бота Telegram. Мой код перебирает список принадлежащих мне учетных записей, и если одна учетная запись выдает ошибку, я хочу вывести ее из списка на 5 часов.

В любом случае, вот мой код, для этого подхода, как Я останавливаю указанный поток c после того, как add_account запустился один раз?

Я бы также оценил лучший подход в этом вопросе.

import threading

accounts = [ {"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5} ]
break_accounts = []

PING_ON = threading.Event()


def remove_account(account):

    break_accounts.append(account)
    accounts.remove(account)
    print(accounts)
    print(break_accounts)
    t = threading.Thread(target=add_account(account))
    t.start()

    PING_ON.set()

def add_account(account):
    while not PING_ON.wait(20):

        break_accounts.remove(account)
        accounts.append(account)
        print(accounts)
        print(break_accounts)



def start():
    for account in accounts:
        if account["id"] == 4:
            remove_account(account)


start()

1 Ответ

2 голосов
/ 07 января 2020

Я думаю, что вы находитесь на ненужной шаткой земле, используя потоки. Не нужно для этого, особенно если вы новичок в Python.

До этого список-словарь ваших учетных записей нечетен. Просто составьте словарь учетных записей с идентификатором в качестве ключа. (См. Мое ниже.) Непонятно, почему вы сделали ненужные словари в списке.

Я бы порекомендовал использовать для этого встроенные datetime и timedelta. Вы можете назначить активное время для каждой учетной записи и сравнить его с системными часами, которые доступны.

Вот идея ниже. Есть несколько возможных вариантов этого ... основная предпосылка c состоит в том, чтобы сохранить маркер для каждой учетной записи, обновить его с текущего времени, когда это необходимо, и проверить его, прежде чем что-то делать с учетной записью

from datetime import datetime, timedelta
import time

accounts = {'id_1': 100, 'id_2': 205, 'id_3': 310}

# make dictionary of reactivate times for all id's using minimum value (active at start)
reactiveate_times = {id: datetime.min for id in accounts}

def suspend(id, reactiveate_times, suspension_minutes=1):
    reactiveate_times[id] = datetime.now() + timedelta(minutes=suspension_minutes)


suspend('id_2', reactiveate_times)

for t in range(5):    # run the loop 5 x 20 sec (100 seconds) to see acct 2 reactivate
    print(f'at time {datetime.now()} these accounts are active:')
    for id in accounts:
        if datetime.now() > reactiveate_times.get(id):
            print(f'  account {id} is active!')

    time.sleep(20)
...