Python Sleep Function: วิธีเพิ่มความล่าช้าในโค้ด

เผยแพร่แล้ว: 2022-12-01

บทช่วยสอนนี้จะสอนวิธีใช้ฟังก์ชัน sleep() จากโมดูลเวลาในตัวของ Python เพื่อเพิ่มการหน่วงเวลาให้กับโค้ด

เมื่อคุณเรียกใช้โปรแกรม Python อย่างง่าย การดำเนินการโค้ดจะเกิดขึ้น ตามลำดับ — หนึ่งคำสั่งหลังจากนั้นอีกคำสั่งหนึ่ง — โดยไม่มี การหน่วงเวลา อย่างไรก็ตาม คุณอาจต้องชะลอการดำเนินการโค้ดในบางกรณี ฟังก์ชัน sleep() จากโมดูลเวลาในตัวของ Python ช่วยให้คุณทำสิ่งนี้ได้

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้ไวยากรณ์ของการใช้ฟังก์ชัน sleep() ใน Python และตัวอย่างต่างๆ เพื่อทำความเข้าใจวิธีการทำงาน มาเริ่มกันเลย!

ไวยากรณ์ของ Python time.sleep()

โมดูล time ที่สร้างขึ้นในไลบรารีมาตรฐานของ Python มีฟังก์ชันที่เกี่ยวข้องกับเวลาที่มีประโยชน์หลายอย่าง ในขั้นตอนแรก ให้นำเข้าโมดูล time ในสภาพแวดล้อมการทำงานของคุณ:

 import time

เนื่องจากฟังก์ชัน sleep() เป็นส่วนหนึ่งของโมดูล time ตอนนี้คุณจึงสามารถเข้าถึงและใช้งานด้วยไวยากรณ์ทั่วไปต่อไปนี้:

 time.sleep(n)

โดยที่ n คือจำนวน วินาที ที่จะหลับ อาจเป็นจำนวนเต็มหรือเลขทศนิยมก็ได้

บางครั้งการหน่วงเวลาที่กำหนดอาจเป็นไม่กี่มิลลิวินาที ในกรณีเหล่านี้ คุณสามารถแปลงระยะเวลาเป็นมิลลิวินาทีเป็นวินาที และใช้ในการเรียกใช้ฟังก์ชันสลีป ตัวอย่างเช่น ถ้าคุณต้องการแนะนำการหน่วงเวลา 100 มิลลิวินาที คุณสามารถระบุเป็น 0.1 วินาที: time.sleep(0.1)

คุณยังสามารถนำเข้าเฉพาะฟังก์ชันส sleep ปจากโมดูล time :

 from time import sleep

หากคุณใช้วิธีการนำเข้าข้างต้น คุณสามารถเรียกใช้ฟังก์ชัน sleep() ได้โดยตรงโดยไม่ต้องใช้ time.sleep()

ตอนนี้คุณได้เรียนรู้ไวยากรณ์ของฟังก์ชัน Python sleep() แล้ว เรามาโค้ดตัวอย่างเพื่อดูการทำงานของฟังก์ชัน คุณสามารถดาวน์โหลดสคริปต์ Python ที่ใช้ในบทช่วยสอนนี้ได้จากโฟลเดอร์ python-sleep ใน repo GitHub นี้

การดำเนินการโค้ดล่าช้าด้วยโหมดสลีป ()

ตัวอย่างแรก ลองใช้ฟังก์ชัน sleep เพื่อหน่วงเวลาการทำงานของโปรแกรม Python อย่างง่าย

การดำเนินการโค้ดล่าช้า

ในข้อมูลโค้ดต่อไปนี้:

  • คำสั่ง first print() ถูกดำเนินการโดยไม่ชักช้า
  • จากนั้นเราจะแนะนำการหน่วงเวลา 5 วินาทีโดยใช้ฟังก์ชัน sleep()
  • คำสั่ง print() ที่สองจะถูกดำเนินการหลังจากการดำเนินการพักเครื่องเสร็จสิ้นเท่านั้น
 # /python-sleep/simple_example.py import time print("Print now") time.sleep(5) print("Print after sleeping for 5 seconds")

ตอนนี้เรียกใช้ไฟล์ simple_example.py และสังเกตผลลัพธ์:

 $ python3 simple_example.py
วิดีโอ YouTube

เพิ่มความล่าช้าต่างๆ ให้กับ Code Block

ในตัวอย่างก่อนหน้านี้ เราแนะนำการหน่วงเวลาคงที่ 5 วินาทีระหว่างการดำเนินการของคำสั่ง print() สองคำสั่ง ต่อไป เรามาเขียนโค้ดอีกตัวอย่างหนึ่งเพื่อแนะนำเวลาหน่วงที่แตกต่างกันเมื่อวนซ้ำผ่าน iterable

ในตัวอย่างนี้ เราต้องการดำเนินการดังต่อไปนี้:

  • วนซ้ำประโยค เข้าถึงแต่ละคำ และพิมพ์ออกมา
  • หลังจากพิมพ์แต่ละคำออกมาแล้ว เราต้องการรอเป็นระยะเวลาหนึ่งก่อนที่จะพิมพ์คำถัดไปในประโยค

การวนซ้ำผ่านสายของสตริง

พิจารณาสตริง sentence เป็นสตริงที่แต่ละคำเป็นสตริงในตัวเอง

ถ้าเราวนลูปเราจะได้ตัวอักษรแต่ละตัวดังรูป

 >>> sentence = "How long will this take?" >>> for char in sentence: ... print(char) # Output (truncated for readability) H o w . . . t a k e ?

แต่นี่ไม่ใช่สิ่งที่เราต้องการ เราต้องการวนซ้ำประโยคและเข้าถึงแต่ละคำ ในการทำเช่นนี้ เราสามารถเรียกใช้เมธอด split() บนสตริง sentence การดำเนินการนี้จะส่งคืนรายการสตริงที่ได้รับจากการแยกสตริง sentence บนช่องว่างที่เกิดขึ้น ทั้งหมด

 >>> sentence.split() ['How', 'long', 'will', 'this', 'take?'] >>> for word in sentence.split(): ... print(word) # Output How long will this take?

การวนซ้ำผ่าน Iterables ด้วยความล่าช้าที่แตกต่างกัน

มาดูตัวอย่างกันอีกครั้ง:

  • sentence คือสตริงที่เราต้องการวนซ้ำเพื่อเข้าถึงแต่ละคำ
  • delay_times คือรายการของเวลาหน่วงที่เราจะใช้เป็นอาร์กิวเมนต์ของฟังก์ชัน sleep() ระหว่างการผ่านลูปแต่ละครั้ง

ที่นี่เราต้องการวนซ้ำสองรายการพร้อมกัน: รายการ delay_times และรายการสตริงที่ได้จากการแยกสตริง sentence คุณสามารถใช้ฟังก์ชัน zip() เพื่อทำการวนซ้ำแบบขนานนี้

Python zip() ฟังก์ชัน : zip(list1, list2) ส่งคืนตัววนซ้ำของทูเพิล โดยที่แต่ละทูเพิลมีรายการที่ดัชนี i ใน list1 และ list2

 # /python-sleep/delay_times.py import time sleep_times = [3,4,1.5,2,0.75] sentence = "How long will this take?" for sleep_time,word in zip(sleep_times,sentence.split()): print(word) time.sleep(sleep_time)

หากไม่มีฟังก์ชันสลีป ตัวควบคุมจะดำเนินการวนซ้ำถัดไปทันที เนื่องจากเราได้แนะนำการหน่วงเวลา การผ่านลูปครั้งต่อไปจะเกิดขึ้นหลังจากการดำเนินการสลีปเสร็จสิ้นเท่านั้น

ตอนนี้เรียกใช้ delay_times.py และสังเกตผลลัพธ์:

 $ python3 delay_times.py

คำที่ตามมาในสตริงจะถูกพิมพ์ออกมาหลังจากการหน่วงเวลา การหน่วงเวลาหลังจากพิมพ์คำที่ดัชนี i ในสตริงคือตัวเลขที่ดัชนี i ในรายการ delay_times

วิดีโอ YouTube

ตัวจับเวลาถอยหลังใน Python

จากตัวอย่างต่อไป ให้เราเขียนโค้ดตัวนับเวลาถอยหลังอย่างง่ายใน Python

นับถอยหลังจับเวลาในหลาม

มากำหนดฟังก์ชั่น countDown() :

 # /python-sleep/countdown.py import time def countDown(n): for i in range(n,-1,-1): if i==0: print("Ready to go!") else: print(i) time.sleep(1)

ต่อไป เรามาแยกคำนิยามของ countDown() กัน:

  • ฟังก์ชันรับจำนวน n เป็นอาร์กิวเมนต์และนับถอยหลังจนถึงศูนย์โดยเริ่มจากจำนวนนั้น n
  • เราใช้ time.sleep(1) เพื่อให้เกิดความล่าช้า 1 วินาทีระหว่างการนับ
  • เมื่อนับถึง 0 ฟังก์ชันจะพิมพ์ข้อความว่า “พร้อมลุย!”

เพื่อให้ได้การดำเนินการนับถอยหลัง เราได้ใช้ฟังก์ชัน range() ที่มีค่าขั้นลบเป็น -1 range(n, -1, -1) จะช่วยให้เราวนซ้ำช่วงของตัวเลขใน n, n – 1, n – 2 ไปเรื่อยๆ จนถึงศูนย์ จำได้ว่าจุดสิ้นสุดถูกแยกออกตามค่าเริ่มต้นเมื่อใช้ฟังก์ชัน range()

ต่อไปเราจะเพิ่มการเรียกไปยัง countDown() โดยมี 5 เป็นอาร์กิวเมนต์

 countDown(5)

ตอนนี้เรียกใช้สคริปต์ countdown.py และดูการทำงานของฟังก์ชั่น countDown !

 $ python3 countdown.py
วิดีโอ YouTube

ฟังก์ชั่นสลีปในมัลติเธรด

Python threading module นำเสนอความสามารถในการทำงานแบบมัลติเธรดที่นอกกรอบ ใน Python นั้น Global Interpreter Lock หรือ GIL ช่วยให้มั่นใจได้ว่ามีเธรดที่ใช้งานอยู่เพียงเธรดเดียวที่รัน ณ เวลาใดเวลาหนึ่ง

หลามนอน-3

อย่างไรก็ตาม ในระหว่างการดำเนินการ I/O และการดำเนินการรอเช่นโหมดสลีป โปรเซสเซอร์สามารถระงับการดำเนินการของเธรดปัจจุบันและสลับไปยังเธรดอื่นที่กำลังรออยู่

เพื่อให้เข้าใจถึงวิธีการทำงาน ลองมาดูตัวอย่างกัน

การสร้างและเรียกใช้เธรดใน Python

พิจารณาฟังก์ชันต่อไปนี้ func1() , func2() และ func3() พวกเขาวนซ้ำช่วงของตัวเลขและพิมพ์ออกมา ตามมาด้วยการทำงานแบบสลีปตามจำนวนวินาทีที่กำหนด ระหว่างการผ่านลูปทุกครั้ง เราได้ใช้เวลาหน่วงที่แตกต่างกันสำหรับแต่ละฟังก์ชันเพื่อให้เข้าใจได้ดีขึ้นว่าการดำเนินการสลับไปมาระหว่างเธรดพร้อมกันอย่างไร

 import time def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5)

ใน Python คุณสามารถใช้ตัวสร้าง Thread() เพื่อสร้างอินสแตนซ์ของเธรดอ็อบเจ็กต์ การใช้ threading.Thread(target = …, args = …) สร้างเธรดที่เรียกใช้ฟังก์ชัน target ด้วยอาร์กิวเมนต์ที่ระบุใน tuple ของ args

ในตัวอย่างนี้ ฟังก์ชัน func1 , func2 และ func3 จะไม่รับอาร์กิวเมนต์ใดๆ ดังนั้นการระบุเพียงชื่อของฟังก์ชันเป็นเป้าหมายก็เพียงพอแล้ว จากนั้นเรากำหนด thread object, t1 , t2 และ t3 โดยมี func1 , func2 และ func3 เป็นเป้าหมายตามลำดับ

 t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()

นี่คือรหัสที่สมบูรณ์สำหรับตัวอย่างเธรด:

 # /python-sleep/threads.py import time import threading def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5) t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()

สังเกตผลลัพธ์ การดำเนินการเปลี่ยนแปลงระหว่างสามเธรด เธรด t3 มีเวลารอน้อยที่สุด ดังนั้นเธรดจึงถูกระงับโดยใช้เวลาน้อยที่สุด เธรด t1 มีระยะเวลาสลีปนานที่สุดคือสองวินาที ดังนั้นจึงเป็นเธรดสุดท้ายที่จะเสร็จสิ้นการดำเนินการ

วิดีโอ YouTube

หากต้องการเรียนรู้เพิ่มเติม โปรดอ่านบทช่วยสอนเกี่ยวกับพื้นฐานของมัลติเธรดใน Python

บทสรุป

ในบทช่วยสอนนี้ คุณได้เรียนรู้วิธีใช้ฟังก์ชัน sleep() ของ Python เพื่อเพิ่มการหน่วงเวลาให้กับโค้ด

คุณสามารถเข้าถึงฟังก์ชัน sleep() ได้จากโมดูลเวลาในตัว time.sleep() หากต้องการชะลอการดำเนินการ n วินาที ให้ใช้ time.sleep(n) นอกจากนี้ คุณยังได้เห็นตัวอย่างการหน่วงเวลาการวนซ้ำที่ตามมาในลูปด้วยค่าต่างๆ การนับถอยหลัง และมัลติเธรด

ตอนนี้คุณสามารถสำรวจความสามารถขั้นสูงเพิ่มเติมของโมดูลเวลาได้แล้ว ต้องการทำงานกับวันที่และเวลาใน Python หรือไม่ นอกจากโมดูลเวลาแล้ว คุณยังสามารถใช้ประโยชน์จากฟังก์ชันของโมดูลวันที่และเวลาและปฏิทินได้อีกด้วย

ต่อไป เรียนรู้การคำนวณความแตกต่างของเวลาใน Python