13 Soru: Python'da zaman gecikmesini nasıl yapabilirim?

tarafından oluşturulan soru Mon, Jun 11, 2018 12:00 AM

Python komut dosyasında zaman gecikmesini nasıl koyacağımı bilmek istiyorum.

    
2510
  1. 2019-04-16 16: 46: 30Z
13 Yanıtlar                              13                         
 
import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

Burada, bir şeyin yaklaşık dakikada bir kez çalıştırıldığı başka bir örnek verilmiştir:

 
import time
while True:
    print("This prints once a minute.")
    time.sleep(60) # Delay for 1 minute (60 seconds).
    
2742
2018-06-14 21: 04: 58Z
  1. Bazı koşullara ihtiyacınız varsa
    . Kullanıcı threading.Event.wait için daha iyidir.
    2014-04-25 08: 14: 32Z
  2. Şey ... bundan daha az basar, çünkü tüm tamponları yazdırmak ve işlemek zaman alır (muhtemelen bir çekirdek bağlamı anahtarını yapmak), ve alarm sinyalini kaydetmek için, ama ... evet. Dakikada bir kez biraz altında.
    2015-06-17 19: 29: 46Z
  3. , tkinter'ı grafik kullanıcı arayüzü olarak kullanırken, sleep () işi yapmaz - yerine after () işlevini kullanın: tkinter.Tk.after (yourrootwindow, 60000) veya yourrootwindow.after(60000)
    2017-08-03 10: 41: 35Z
  4. Windows'ta umabileceğiniz en iyi ayrıntı düzeyinin yaklaşık 0.015 saniye (15 ms) doğruluk olduğunu belirtmekte fayda var. Modern işlemcilerde Linux'un çoğu sürümü 0,001 saniyeye (1 ms) kadar ayrıntı derecesine kadar düşebilir.
    2018-03-31 00: 07: 36Z
  5. Gerçekten de. Tkinter yorumu bir yorum yerine bir cevap olarak sunulacaktı. Buraya, yıllarca gelecek olan, Google üzerinden yanıtları bulan ve pek çok insanın yorumları okumak için asla bulamayacağı bir veritabanı oluşturuyoruz. Bu bile harika bir soru olurdu. "Tkinter kullanırken Python'da zaman gecikmesi nasıl yapılır" satırları boyunca bir şey.
    2018-04-10 15: 29: 46Z

sleep() modülünde time işlevini kullanabilirsiniz. İkinci saniye çözünürlüğü için değişken bir argüman alabilir.

 
from time import sleep
sleep(0.1) # Time in seconds
    
699
2019-05-21 23: 03: 05Z
  

Python'da zaman gecikmesini nasıl yapabilirim?

Tek bir başlıkta uyku işlevini öneririm:

 
>>> from time import sleep

>>> sleep(4)

Bu işlev aslında işletim sistemi tarafından çağrıldığı iş parçacığının işlenmesini askıya alır, diğer iş parçacıklarının ve işlemlerin uyurken yürütülmesine izin verir.

Bu amaç için kullanın veya bir işlevin yürütülmesini geciktirmek için kullanın. Örneğin:

 
>>> def party_time():
...     print('hooray!')
... 
>>> sleep(3); party_time()
hooray!

"yaşasın!" Enter 'a bastıktan 3 saniye sonra yazdırılıyor.

sleep'u çoklu iş parçacığı ve işlemlerle kullanma örneği

Yine, sleep iş parçacığınızı askıya alır - sıfır işlem gücünün yanında kullanılır.

Göstermek için, böyle bir komut dosyası oluşturun (önce etkileşimli bir Python 3.5 kabuğunda denedim, ancak alt işlemler party_later işlevini bulamıyor.nedense):

 
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()

Bu betiğin örnek çıktısı:

 
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

Çoklu kullanım

Daha sonra Timer iş parçacığı nesnesi:

 
>>> from threading import Timer
>>> t = Timer(3, party_time, args=None, kwargs=None)
>>> t.start()
>>>
>>> hooray!

>>> 

Boş satır, işlevin benim standart çıktıma yazdırıldığını ve hızlı bir şekilde istediğimden emin olmak için Enter tuşuna basmam gerektiğini gösteriyor.

Bu yöntemin tersi, Timer iş parçacığı beklerken, başka bir şey yapmayı başardım, bu durumda, bir kez Enter 'i tıklatarak - işlev yürütülmeden önce (boş olana bakın) istemi).

çoklu işlem kitaplığında ilgili bir nesne yok. Bir tane oluşturabilirsiniz, ancak büyük olasılıkla bir sebep yoktur. Alt iş parçacığı, basit bir zamanlayıcı için yepyeni bir alt işlemden çok daha anlamlı olur.

    
71
2019-03-05 14: 27: 24Z

Uykulu bir eğlenceyle biraz eğlenmek jeneratör .

Soru, zaman gecikmesi ile ilgili. Sabit bir zaman olabilir, ancak bazı durumlarda son zamandan beri ölçülen bir gecikmeye ihtiyacımız olabilir. İşte olası bir çözüm:

Son zamandan beri ölçülen gecikme (düzenli olarak uyanma)

Durum olabilir, mümkün olduğunca düzenli bir şey yapmak istiyoruz ve kodumuzun etrafındaki tüm last_time, next_time işleriyle uğraşmak istemiyoruz.

Buzzer jeneratörü

Aşağıdaki kod ( sleepy.py ) bir buzzergen jeneratörü tanımlar:

 
import time
from itertools import count

def buzzergen(period):
    nexttime = time.time() + period
    for i in count():
        now = time.time()
        tosleep = nexttime - now
        if tosleep > 0:
            time.sleep(tosleep)
            nexttime += period
        else:
            nexttime = now + period
        yield i, nexttime

Düzenli zil sesi çağırmak

 
from sleepy import buzzergen
import time
buzzer = buzzergen(3) # Planning to wake up each 3 seconds
print time.time()
buzzer.next()
print time.time()
time.sleep(2)
buzzer.next()
print time.time()
time.sleep(5) # Sleeping a bit longer than usually
buzzer.next()
print time.time()
buzzer.next()
print time.time()

Ve çalıştırırken şunu görüyoruz:

 
1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

Bunu doğrudan bir döngüde de kullanabiliriz:

 
import random
for ring in buzzergen(3):
    print "now", time.time()
    print "ring", ring
    time.sleep(random.choice([0, 2, 4, 6]))

Ve çalıştırırken şunu görebiliriz:

 
now 1400102751.46
ring (0, 1400102754.461676)
now 1400102754.46
ring (1, 1400102757.461676)
now 1400102757.46
ring (2, 1400102760.461676)
now 1400102760.46
ring (3, 1400102763.461676)
now 1400102766.47
ring (4, 1400102769.47115)
now 1400102769.47
ring (5, 1400102772.47115)
now 1400102772.47
ring (6, 1400102775.47115)
now 1400102775.47
ring (7, 1400102778.47115)

Gördüğümüz gibi, bu zil çok katı değil ve uyuyakal ve düzenli zamanlamadan çıksak bile düzenli uykulu zamanları yakalamamıza izin veriyor.

    
48
2018-06-15 03: 56: 53Z

Python standart kütüphanesindeki tkinter kütüphanesi, içe aktarabileceğiniz etkileşimli bir araçtır. Temel olarak, düğmeler, kutular ve açılır pencereler ve kodla değiştirdiğiniz pencereler gibi görünen öğeler oluşturabilirsiniz.

Eğer tkinter kullanıyorsanız, TIME.SLEEP() KULLANMAYIN, çünkü programınıza zarar verecektir. Bu bana oldu. Bunun yerine, root.after()'u kullanın ve değerleri ancak birkaç saniye boyunca milisaniye ile değiştirin. E.g, time.sleep(1), tkinter'da root.after(1000)'a eşittir.

Aksi takdirde, birçok yanıtın işaret ettiği time.sleep(), ki bu da yoludur.

    
26
2017-12-10 13: 18: 21Z

Gecikmeler, zaman kitaplığı , özellikle time.sleep() işlevi.

Bir saniye bekletmek için:

 
from time import sleep
sleep(1)

Bu çalışır çünkü yaparak:

 
from time import sleep

uyku fonksiyonunu çıkartın zaman kitaplığından , bu sayede hemen arayabilirsin ile:

 
sleep(seconds)

Yazmak yerine,

 
time.sleep()

Yazması çok garip bir şekilde uzun.

Bu yöntemle, zamanın diğer özelliklerine erişemezsiniz kitaplığı ve sleep adlı bir değişkene sahip olamazsınız. Ancak time adlı bir değişken oluşturabilirsiniz.

Yalnızca yapıyorsanız, from [library] import [function] (, [function2]) 'u yapmak harikadır. bir modülün belirli bölümlerini istemek için.

Bunu eşit şekilde yapabilirsiniz:

 
import time
time.sleep(1)

ve zaman kütüphanesinin diğer özelliklerine erişebileceksiniz time.clock() , time.[function]() yazdığınız sürece, ancak oluşturamazsınız değişkeni zaman, çünkü içe aktarmanın üzerine yazacaktır. Bunu yapmak için bir çözüm

 
import time as t

zaman kütüphanesine t olarak başvurmanıza izin verir Yapmanız Gerekenler:

 
t.sleep()

Bu, herhangi bir kütüphanede çalışır.

    
26
2019-02-02 11: 19: 28Z

Bildiğim 5 yöntem var: time.sleep(), pygame.time.wait(), matplotlib'in pyplot.pause(), .after() ve driver.implicitly_wait().


time.sleep() örnek (Tkinter kullanıyorsanız kullanmayın):

 
import time
print('Hello')
time.sleep(5) #number of seconds
print('Bye')

pygame.time.wait() örneği (pygame penceresini kullanmıyorsanız önerilmez, ancak pencereden anında çıkabilirsiniz):

 
import pygame
#If you are going to use the time module
#don't do "from pygame import *"
pygame.init()
print('Hello')
pygame.time.wait(5000)#milliseconds
print('Bye')

matplotlib'in işlevi pyplot.pause() örneği (grafiği kullanmıyorsanız önerilmez, ancak grafikten anında çıkabilirsiniz):

 
import matplotlib
print('Hello')
matplotlib.pyplot.pause(5)#seconds 
print('Bye')

.after() yöntemi (Tkinter ile en iyisi):

 
import tkinter as tk #Tkinter for python 2
root = tk.Tk()
print('Hello')
def ohhi():
 print('Oh, hi!')
root.after(5000, ohhi)#milliseconds and then a function
print('Bye')

Sonunda, driver.implicitly_wait() yöntemi (selenyum):

 
driver.implicitly_wait(5)#waits 5 seconds
    
24
2019-02-25 14: 29: 53Z

Gecikmeler, aşağıdaki yöntemler kullanılarak da uygulanabilir.

İlk yöntem

 
import time
time.sleep(5) # Delay for 5 seconds.

Gecikme için ikinci yöntem gizli bekleme yöntemini kullanmak olacaktır:

 
 driver.implicitly_wait(5)

Üçüncü yöntem, belirli bir işlem tamamlanana veya bir öğe bulunana kadar beklemeniz gerektiğinde daha kullanışlıdır:

 
self.wait.until(EC.presence_of_element_located((By.ID, 'UserName'))
    
23
2019-06-13 10: 04: 34Z
  1. İkinci ve üçüncü yöntem Python per-se değil, selenyum ile ilgili. E2E testleri yaparken onları kullanırdın. OP bunlardan hiçbirinden bahsetmedi.
    2018-05-05 08: 28: 09Z

asyncio.sleep

Son python sürümlerinde (python 3.4 veya daha üstü), asyncio.sleep kullanabilirsiniz. Asenkron programlama ve asyncio ile ilgili. Bir sonraki örneğe göz atın:

 
import asyncio
from datetime import datetime

@asyncio.coroutine
def countdown(iteration_name, countdown_sec):
    """
    Just count for some countdown_sec seconds and do nothing else
    """
    while countdown_sec > 0:
       print(f'{iteration_name} iterates: {countdown_sec} seconds')
       yield from asyncio.sleep(1)
       countdown_sec -= 1

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(countdown('First Count', 2)),
         asyncio.ensure_future(countdown('Second Count', 3))]

start_time = datetime.utcnow() 

# run both methods. How much time will both run...?
loop.run_until_complete(asyncio.wait(tasks))

loop.close()

print(f'total running time: {datetime.utcnow() - start_time}')

İlk yöntem için 2 saniye, daha sonra ikinci yöntemde 3 saniye, "bu kodun toplam 5 saniye çalışma süresi" uyuyabileceğini düşünebiliriz. Ancak .. yazdıracak:

 
total_running_time: 0:00:03.01286

Daha fazla ayrıntı için asyncio resmi belgelerini okumayı tavsiye edin

    
7
2018-12-03 19: 32: 42Z

Bu, gecikme süresi için kolay bir örnektir:

 
import time

def delay(period='5'):
    # If the user enters nothing, It'll wait 5 seconds
    try:
        #If the user not enters a int, I'll just return ''
        time.sleep(period)
    except:
        return ''

Tkinter'da bir tane daha:

 
import tkinter

def tick():
    pass

root=Tk()
delay=100 # time in milliseconds
root.after(delay,tick)
root.mainloop()
    
6
2018-09-16 08: 14: 05Z

Herkes de facto time modülünü önermiş olsa da, matplotlib'un pyplot işlevini kullanarak farklı bir yöntem paylaşacağımı düşündüm, pause .

Bir örnek

 
from matplotlib import pyplot as plt
plt.pause(5)    # Pauses the program for 5 seconds

Tipik olarak bu, komplo çizildiği anda kaybolmasını önlemek veya kaba animasyonlar yapmak için kullanılır.

Zaten import içe aktarılmışsa bu size matplotlib kazandırır.

    
5
2018-06-15 04: 57: 44Z

Python'da zaman gecikmesi koymak istiyorsanızkomut dosyası:

Bunun gibi time.sleep veya Event().wait kullanın:

 
from threading import Event
from time import sleep

delay_in_sec = 2

# use time.sleep like this
sleep(delay_in_sec)         # returns None
print(f'slept for {delay_in_sec} seconds')

# or use Event().wait like this
Event().wait(delay_in_sec)  # returns False
print(f'waited for {delay_in_sec} seconds')       

Ancak, bir işlevin yürütülmesini geciktirmek istiyorsanız, bunu yapın:

threading.Timer kullanın bunu beğendi:

 
from threading import Timer 

delay_in_sec = 2

def hello(delay_in_sec):
    print(f'function called after {delay_in_sec} seconds')

t = Timer(delay_in_sec, hello, [delay_in_sec])  # hello function will be called 2 sec later with [delay_in_sec] as *args parameter
t.start()  # returns None
print("Started")

Çıktılar:

 
Started
function called after 2 seconds         

Neden sonraki yaklaşımı kullanıyorsunuz?

  • Tüm betiğin yürütülmesini durdurmaz . (aktardığınız işlev hariç)
  • Zamanlayıcıyı başlattıktan sonra, timer_obj.cancel() yaparak da durdurabilirsiniz.
5
2019-01-23 05: 41: 03Z

Autopygui kurulu ise, şunları kullanabilirsiniz:

 
#imports
import pyautogui

pyautogui._autoPause(time1)

Toplam duraklama süresi time1 saniye olacak

    
0
2019-06-21 05: 12: 23Z
  1. time1 * time2'un nedeni nedir?
    2019-06-18 05: 21: 06Z
  2. belki, çünkü zaman1, zaman başına ne kadar ara vermeniz gerektiği ve zaman2 ise, zamanın ne kadarını duraklatmak istediğinizdir. Ama garip olan, her ikisi de yüzebilen olabilir. Örneğin, 1,5 saniye tekrarlanan 1,5 sn Duraklatma süresi alabilir, toplam 1,5 saniye duraklama süresi alabilirsiniz * 1,5 sn
    2019-06-18 06: 05: 35Z
  3. Bu işlevsellik belgelenmediyse , bu yüzden ona güvenmezdim. Dahası, 2019-06-18 08: 21: 04Z
  4. öyleyse duraklatma süresi time time1 * * time2 değildir, ancak if not time2 == 0: sleep(time1)'dur
    2019-06-21 05: 12: 09Z
kaynak yerleştirildi İşte