Mẫu này xuất hiện rất nhiều nhưng tôi không thể tìm được câu trả lời thẳng.Hành vi của time.sleep của Python (0) trong linux - Nó có gây ra chuyển đổi ngữ cảnh không?
Một không quan trọng, chương trình un thân thiện có thể làm
while(True):
# do some work
Sử dụng công nghệ và nền tảng khác, nếu bạn muốn cho phép chương trình này để chạy nóng (sử dụng càng nhiều chu kỳ CPU càng tốt) nhưng phải lịch sự - cho phép các chương trình khác đang chạy nóng để có hiệu quả làm chậm tôi xuống, bạn sẽ thường xuyên viết:
while(True):
#do some work
time.sleep(0)
tôi đã đọc thông tin mâu thuẫn về việc liệu các tiếp cận thứ hai sẽ làm những gì tôi muốn hy vọng vào python, chạy trên một hộp linux. Nó có gây ra sự chuyển đổi ngữ cảnh, dẫn đến hành vi mà tôi đã đề cập ở trên không?
EDIT: Đối với những gì đáng giá, chúng tôi đã thử một chút thử nghiệm trong Apple OSX (không có hộp linux tiện dụng). Hộp này có 4 lõi cộng hyperthreading vì vậy chúng tôi quay lên 8 chương trình chỉ với một
while(True):
i += 1
Đúng như dự đoán, các Monitor hoạt động cho mỗi người trong số 8 quá trình như tiêu thụ hơn 95% CPU (rõ ràng với 4 lõi và hyperthreading bạn nhận được 800% tổng số). Sau đó chúng tôi quay một chương trình thứ chín như vậy. Bây giờ tất cả 9 chạy khoảng 85%. Bây giờ hãy giết người thứ chín và quay lên một chương trình với
while(True):
i += 1
time.sleep(0)
Tôi hy vọng rằng quá trình này sẽ sử dụng gần 0% và 8 khác sẽ chạy 95%. Nhưng thay vào đó, tất cả chín chạy khoảng 85%. Vì vậy, trên Apple OSX, giấc ngủ (0) dường như không có hiệu lực.
Điều đó hữu ích. Tôi muốn chắc chắn rằng tôi hiểu kết luận của bạn. Time.sleep (0) đang gây ra một chuyển đổi ngữ cảnh - phải không? Nhưng tôi nghĩ rằng có lẽ giả định của tôi là sai rằng điều này sẽ khiến chương trình của tôi thân thiện hơn với các quy trình khác? –
@Matthew có hai thứ - có một chuyển ngữ cảnh (chuyển đổi nhiệm vụ như chuyển sang một tiến trình khác) và chuyển sang chế độ hạt nhân - chỉ cần chuyển sang chế độ hạt nhân không nhất thiết có nghĩa là bạn cũng sẽ cung cấp thời gian CPU khác. Thêm một sự chậm trễ có thể (nếu có cái gì khác đang chạy) sẽ. Điều này (ngủ (0)) chắc chắn sẽ đưa bạn vào chế độ hạt nhân; nó phụ thuộc vào hạt nhân trong câu hỏi là liệu yêu cầu không có sự chậm trễ ngay lập tức đánh thức chương trình của bạn một lần nữa, hoặc nếu nó tìm kiếm các quá trình khác cũng đang chờ đợi thời gian cpu với hết thời gian chờ hết hạn trên bộ mô tả tập tin. –
Trên thực tế lựa chọn tôi không phải trên stdin. Đối số đầu tiên để chọn() là số lượng các trình đệ trình trong ba tập hợp ... trong trường hợp này 0. Đây là một thủ thuật để thực hiện các lần truy cập dựa trên nano giây. –