Как я могу сделать задержку в Python?
В одной теме я предлагаю функцию сна :
>>> from time import sleep
>>> sleep(4)
Эта функция фактически приостанавливает обработку потока, в котором она вызывается операционной системой, что позволяет другим потокам и процессам выполняться во время сна.
Используйте его для этой цели или просто для задержки выполнения функции. Например:
>>> def party_time():
... print('hooray!')
...
>>> sleep(3); party_time()
hooray!
"ура!" печатается через 3 секунды после нажатия Enter .
Пример использования sleep
с несколькими потоками и процессами
Опять же, sleep
приостанавливает ваш поток - он использует почти нулевую вычислительную мощность.
Чтобы продемонстрировать, создайте такой скрипт (я сначала попытался сделать это в интерактивной оболочке Python 3.5, но подпроцессы по какой-то причине не могут найти функцию party_later
):
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
from time import sleep, time
def party_later(kind='', n=''):
sleep(3)
return kind + n + ' party time!: ' + __name__
def main():
with ProcessPoolExecutor() as proc_executor:
with ThreadPoolExecutor() as thread_executor:
start_time = time()
proc_future1 = proc_executor.submit(party_later, kind='proc', n='1')
proc_future2 = proc_executor.submit(party_later, kind='proc', n='2')
thread_future1 = thread_executor.submit(party_later, kind='thread', n='1')
thread_future2 = thread_executor.submit(party_later, kind='thread', n='2')
for f in as_completed([
proc_future1, proc_future2, thread_future1, thread_future2,]):
print(f.result())
end_time = time()
print('total time to execute four 3-sec functions:', end_time - start_time)
if __name__ == '__main__':
main()
Пример вывода из этого скрипта:
thread1 party time!: __main__
thread2 party time!: __main__
proc1 party time!: __mp_main__
proc2 party time!: __mp_main__
total time to execute four 3-sec functions: 3.4519670009613037
Многопоточность
Вы можете запустить функцию, которая будет вызвана позднее, в отдельном потоке с помощью Timer
threading объекта:
>>> from threading import Timer
>>> t = Timer(3, party_time, args=None, kwargs=None)
>>> t.start()
>>>
>>> hooray!
>>>
Пустая строка показывает, что функция распечатана по моему стандарту, и мне пришлось нажать Введите , чтобы убедиться, что я был в приглашении.
Достоинством этого метода является то, что пока ожидался поток Timer
, я смог сделать другие вещи, в данном случае, нажав Enter один раз - до выполнения функции (см. Первую пустое приглашение).
В многопроцессорной библиотеке нет соответствующего объекта . Вы можете создать его, но, вероятно, по какой-то причине его не существует. Подпоток имеет гораздо больше смысла для простого таймера, чем целый новый подпроцесс.