python - مكتبة - كيف يمكنني تأجيل الوقت في بايثون؟




مكتبة اكواد بايثون (9)

أود أن أعرف كيفية وضع تأخير زمني في نص بيثون.


كيف يمكنني تأجيل الوقت في بايثون؟

في موضوع واحد أقترح وظيفة النوم:

>>> from time import sleep

>>> sleep(4)

هذا بالفعل تعليق معالجة مؤشر الترابط الذي يتم استدعاؤه بواسطة نظام التشغيل ، مما يسمح بتنفيذ سلاسل العمليات والعمليات الأخرى أثناء نومه.

استخدمها لهذا الغرض ، أو ببساطة لتأخير وظيفة من التنفيذ. فمثلا:

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

"الصيحة!" طبع 3 ثوانٍ بعد أن أدخِل Enter .

مثال باستخدام sleep مع خيوط وعمليات متعددة

مرة أخرى ، يعلق sleep مؤشر الترابط الخاص بك - يستخدم بجوار قوة معالجة صفر.

لإثبات ذلك ، قم بإنشاء برنامج نصي مثل هذا (حاولت أولاً هذا في shell 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 :

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

>>> 

يوضح السطر الفارغ أن الوظيفة المطبوعة على معيار خارج وكان علي أن تضغط على Enter للتأكد من أنني كنت في موجه.

الاتجاه الصعودي لهذه الطريقة هو أنه في حين كان مؤشر ترابط Timer في الانتظار ، تمكنت من القيام بأشياء أخرى ، في هذه الحالة ، ضرب دخول مرة واحدة - قبل تنفيذ المهمة (راجع أول مطالبة فارغة).

لا يوجد كائن خاص في مكتبة متعدد المعالجات. يمكنك إنشاء واحد ، لكن من المحتمل أنه غير موجود لسبب ما. مؤشر الترابط الفرعي منطقي أكثر بالنسبة لجهاز توقيت بسيط من عملية فرعية جديدة بالكامل.


أفضل طريقة لتأخير الوقت في Python هي استخدام مكتبة time . مثله:

import time
time.sleep(10)

ما عليك سوى استبدال الرقم 10 بكمية الثواني التي تريد تأجيلها. يمكنك استخدام تنسيقات مثل '10 .1 '،' 5.07 '، إلخ.

لا ينصح باستخدام هذا مع Tkinter


في حين أن الجميع قد اقترح الوحدة time الفعلية ، فكرت أن أشارك طريقة مختلفة باستخدام وظيفة pyplot ، pause .

مثال

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

عادة ما يستخدم هذا لمنع المؤامرة من الاختفاء بمجرد رسمها أو لجعل الرسوم المتحركة الخام.

هذا من شأنه أن يوفر لك import إذا كان لديك بالفعل matplotlib المستوردة.


قليلا من المرح مع generator النوم.

السؤال هو حول تأخير الوقت. يمكن أن يكون الوقت ثابتًا ، ولكن في بعض الحالات قد نحتاج إلى تأخير تم قياسه منذ آخر مرة. فيما يلي أحد الحلول الممكنة:

تأخير قياس منذ آخر مرة (الاستيقاظ بشكل منتظم)

يمكن أن يكون الوضع ، نريد أن نفعل شيئًا ما بشكل منتظم قدر الإمكان ، ونحن لا نريد أن last_time next_time الأشياء التي next_time في last_time next_time جميع أنحاء الكود.

مولد الجرس

التعليمات البرمجية التالية ( sleepy.py ) يعرّف مولد buzzergen :

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

استدعاء buzzergen العادية

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

ونشغلها نرى:

1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

يمكننا أيضًا استخدامه مباشرةً في حلقة:

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

ونشغلها قد نرى:

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)

وكما نرى ، فإن هذا الجرس ليس جامدًا جدًا ويسمح لنا بالحصول على فترات نوم منتظمة حتى إذا استمرنا في النوم ونخرج من جدول مواعيد منتظم.


هذا مثال سهل للتأخير الزمني:

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:

import tkinter

def tick():
    pass

root=Tk()
delay=100 # time in milliseconds
root.after(delay,tick)
root.mainloop()

هناك 4 طرق أعرفها: time.sleep() ، pygame.time.wait() ، pyplot.pause() ، و .after() pyplot.pause() .

time.sleep() مثال (لا تستخدم في حالة استخدام Tkinter):

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

pygame.time.wait() (غير مستحسن إذا كنت لا تستخدم نافذة pygame ، ولكن يمكنك الخروج من النافذة على الفور):

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

مثال pyplot.pause() للوظيفة pyplot.pause() لا يوصى به إذا كنت لا تستخدم الرسم البياني ، ولكن يمكنك الخروج من الرسم البياني على الفور):

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

أخيراً ، طريقة .after() (الأفضل مع Tkinter):

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

يمكن تنفيذ التأخير باستخدام ثلاث طرق.

لنبدأ بالسهولة:

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

ستكون الطريقة الثانية للتأخير هي استخدام طريقة الانتظار الضمنية:

 driver.implicitly_wait(5)

تكون الطريقة الثالثة أكثر فائدة عندما تضطر إلى الانتظار حتى اكتمال إجراء معين أو حتى يتم العثور على عنصر:

self.wait.until(EC.presence_of_element_located((By.ID, 'UserName'))

يمكنك استخدام الدالة sleep() في الوحدة الزمنية. يمكن أن تأخذ حجة عائمة لقرار ثانٍ.

from time import sleep
sleep(0.1) # Time in seconds.

import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

إليك مثال آخر حيث يتم تشغيل شيء ما مرة واحدة كل دقيقة:

import time
while True:
    print("This prints once a minute.")
    time.sleep(60) # Delay for 1 minute (60 seconds).




timedelay