Рубрики
Без рубрики

Как дождаться определенного времени в Python?

Всем привет! В этом посте мы посмотрим, как мы можем дождаться определенного времени в Python.

Автор оригинала: Pankaj Kumar.

Как дождаться определенного времени в Python?

Всем привет! В этом посте мы посмотрим, как мы можем дождаться определенного времени в Python.

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

Python предлагает нам разные способы сделать это. Итак, давайте посмотрим на все подходы, которые мы можем использовать: как в однопоточной, а также в многопоточной среде!

Python – ждать определенного времени в однопоточных средах

Если ваша главная программа состоит только из одного потока/программы, то Python делает это очень легко для нас.

Одним из возможных подходов, чтобы сделать программу ждать определенного времени в Python, использует время модуль.

Используя time.sleep () ждать

Мы можем использовать time.sleep (n) ждать N секунды. Конечно, мы можем сделать N быть десятичным, чтобы быть более точным с нашим интервалом!

Вот простой пример, который расплачивается две вызовы функций от 3 секунд в зависимости от друг друга.

import time

def fun1(a):
    return 2 * a

def fun2(a):
    return a * a

if __name__ == '__main__':
    inp = 10
    print(f"Input = {inp}")
    print(f"Result of fun1 call: {fun1(inp)}")
    time.sleep(3) # Wait for 3 seconds
    print(f"After 3 milliseconds, Result of fun2 call: {fun2(inp)}")

Выход

Input = 10
Result of fun1 call: 20
After 3 seconds, Result of fun2 call: 100

Достаточно просто, верно?

Ожидание в многопоточной среде

Если у вас есть несколько потоков в вашей программе, вы все еще можете использовать одну и ту же логику через time.sleep () сделать определенную нить ждать определенного времени в Python

Вот пример, который порождает 3 нити, и заставляет их спать на секунду альтернативы, а другие потоки продолжают печатать номера от 1.

Мы будем использовать chapulent.futures Модуль и использовать ThreadPoolexecutor Для бассейна и выполнения ниток, при этом результаты, используя as_completed () Отказ

Основная структура нереста и выбывания с использованием нитей выглядит следующим образом:

from concurrent.futures import ThreadPoolExecutor, as_completed

# The threads will call this function
def callback():
    pass

with ThreadPoolExecutor() as thread_executor:
    # Await all results
    await_results = [thread_executor.submit(callback) for i in range(1, tid+1)]
    # Fetch them!
    for f in as_completed([future for future in await_results]):
        print(f.result())

Теперь, давайте напишем код для нашей основной программы.

from concurrent.futures import ThreadPoolExecutor, as_completed
import time

# Global Variable for the Thread ID Number
tid = 0
# Spawn 4 threads
NUM_THREADS = 4

def func(arg):
    time.sleep(1)
    return arg * arg

if __name__ == '__main__':
    with ThreadPoolExecutor() as thread_executor:
        start_time = time.time()
        # Going to spawn threads
        tid += NUM_THREADS
        # Await all results
        await_results = [thread_executor.submit(func, arg=i) for i in range(1, tid+1)]
        for f in as_completed([future for future in await_results]):
            print(f.result())
        end_time = time.time()
        print(f"Total Time taken for {NUM_THREADS} threads: {end_time - start_time}")

Выход

1
4
9
16
Total Time taken for 4 threads: 1.0037879943847656

Как видите, мы породили 4 потока, которые все ждали за 1 секунду, прежде чем давать результат функции. Это очень близко к 1 секунду, поэтому наш выход имеет смысл!

Использование Threading.timer () для расписания вызовов функций

Однако, если вы хотите определенную функцию ждать определенного времени в Python, мы можем использовать Threading.timer () Метод от резьба модуль.

Мы покажем простой пример, который расплачивается на вызов функции каждые 5 секунд.

from threading import Timer
import time

def func(a, b):
    print("Called function")
    return a * b

# Schedule a timer for 5 seconds
# We pass arguments 3 and 4
t = Timer(5.0, func, [3, 4])

start_time = time.time()

# Start the timer
t.start()

end_time = time.time()

if end_time - start_time < 5.0:
    print("Timer will wait for sometime before calling the function")
else:
    print("5 seconds already passed. Timer finished calling func()")

Выход

Timer will wait for sometime before calling the function
Called function

Здесь главная программа пришла к последней строке до 5 секунд, поэтому таймер заставляет программу дождаться до тех пор, пока не звонит Func () Отказ

После звонка Func (A, B) , он прекращает программу, так как не больше нечего бегать.

Также обратите внимание, что возвращаемое значение функции не может использоваться основной программой.

Надеюсь, это дало вам еще несколько представлений о планировании и ожидании промежуток времени.

Заключение

В этой статье мы узнали о ожидании определенного периода времени в Python, используя time.sleep () Отказ Мы также видели, как мы могли бы использовать это в многопоточной среде, а также вызовы функций планирования.

использованная литература