ใน Python สำหรับ * ระวังห้ามtime.sleep()
บล็อกเธรดหรือกระบวนการ?
ใน Python สำหรับ * ระวังห้ามtime.sleep()
บล็อกเธรดหรือกระบวนการ?
คำตอบ:
มันบล็อกเธรด หากคุณดูใน Modules / timemodule.c ในแหล่ง Python คุณจะเห็นว่าในการเรียกไปยังfloatsleep()
ส่วนสำคัญของการดำเนินการสลีปจะถูกรวมอยู่ใน Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_TH และบล็อกอื่น ๆ ที่จะดำเนินการในขณะที่ปัจจุบัน หนึ่งนอน คุณสามารถทดสอบสิ่งนี้ด้วยโปรแกรมไพ ธ อนอย่างง่าย:
import time
from threading import Thread
class worker(Thread):
def run(self):
for x in xrange(0,11):
print x
time.sleep(1)
class waiter(Thread):
def run(self):
for x in xrange(100,103):
print x
time.sleep(5)
def run():
worker().start()
waiter().start()
สิ่งที่จะพิมพ์:
>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
มันจะสลีปเธรดยกเว้นในกรณีที่แอปพลิเคชันของคุณมีเธรดเดียวเท่านั้นซึ่งในกรณีนั้นเธรดจะสลีปเธรดและกระบวนการได้อย่างมีประสิทธิภาพเช่นกัน
เอกสารไพ ธ อนเกี่ยวกับการนอนหลับไม่ได้ระบุสิ่งนี้อย่างไรก็ตามฉันสามารถเข้าใจความสับสนได้อย่างแน่นอน!
sleep(3)
พูดว่า: "sleep () ทำให้การเรียกเธรด sleep จนกระทั่งวินาทีที่ผ่านมามีสัญญาณหายไปหรือสัญญาณมาถึงซึ่งไม่ได้ถูกละเว้น" และมีข้อผิดพลาดหลามเอกสาร
เพียงแค่ด้าย
เธรดจะบล็อก แต่กระบวนการยังมีชีวิตอยู่
ในแอปพลิเคชันเธรดเดียวหมายความว่าทุกสิ่งถูกปิดกั้นในขณะที่คุณหลับ ในแอปพลิเคชันแบบมัลติเธรดเฉพาะเธรดที่คุณ 'สลีป' อย่างชัดเจนเท่านั้นที่จะบล็อกและเธรดอื่นยังคงทำงานภายในกระบวนการ
เฉพาะเธรดยกเว้นว่ากระบวนการของคุณมีเธรดเดียว
กระบวนการไม่สามารถรันได้ด้วยตัวเอง ในเรื่องของการประมวลผลโพรเซสเป็นเพียงคอนเทนเนอร์สำหรับเธรด หมายความว่าคุณไม่สามารถหยุดกระบวนการได้เลย มันไม่สามารถใช้ได้กับกระบวนการ
sleep
คำสั่งจะหยุดชั่วคราว
มันบล็อกเธรดถ้ามันถูกดำเนินการในเธรดเดียวกันไม่ถ้ามันถูกดำเนินการจากรหัสหลัก