Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Асинхронный каунтер на python

#python #python_3x #async_await #асинхронность


Есть вот такой простой код на javascript:

function Counter () {
  this.count = 0;
  setInterval(() => this.count++, 1000);
}

var counter = new Counter();


Каждый раз когда я вызываю counter, я получаю значение, которое раз в 1 секунду увеличивается
на 1.

Как написать аналогичную функцию в python?

Если я пробую что-то вроде:

def counter():
    counter = 0
    while counter < 1000:
        counter += 1
        sleep(1)
    return counter

c = counter()


То терминал занят и я не могу получить значение.

А если же так:

def counter():
    counter = 0
    while counter < 1000:
        counter += 1
        sleep(1)
        return counter

c = counter()


то c всегда равен 1 
    


Ответы

Ответ 1



import time def counter(): start = time.time() while True: yield int(time.time() - start) c = counter() print(next(c)) time.sleep(2) print(next(c)) time.sleep(1) print(next(c))

Ответ 2



Чтобы получить целое количество секунд прошедших с момента создания counter: import math import time def counter(): return lambda start=time.monotonic(): math.floor(time.monotonic() - start) Пример, где пауза между вызовами: >>> c = counter() >>> c() 1 >>> c() 4 >>> c() 8 Если хочется посмотреть как аналог setTimeout, setInterval из JavaScript в Питоне реализовать, то примеры для разных библиотек: threading, tkinter, gtk, twisted, asyncio.

Ответ 3



Используйте itertools.count(): import itertools counter = itertools.count() Затем всякий раз, когда будет нужно следующее число, используйте next(counter) (например next_id = next(counter)) так как counter просто итератор. Примечание: itertools.count() позволяет использовать ключевые параметре start и/или step, например itertools.count(start=100, step=10) выдает значения 100, 110, 120, ...

Комментариев нет:

Отправить комментарий