2010-07-12 29 views
9

trong trăn, nếu tôi muốn giữ lại một quá trình hoặc sợi chạy mãi mãi, tôi có thể thường làm điều này với một sản phẩm nào trong khi vòng lặp:chờ đợi chặn Non trong python

while 1: 
    pass 

này, tuy nhiên, sẽ ăn một quả số tiền không công bằng của quá trình CPU. Thêm một giấc ngủ ngắn sẽ hoạt động

import time 
while 1: 
    time.sleep(0.01) 

Có cách nào tốt hơn và sạch hơn để làm việc này không? Cảm ơn

+0

Chuỗi đang chờ là gì? Tại sao bạn không làm time.sleep (1000000)? – Sjoerd

+0

nó dành cho ứng dụng giống như máy chủ, vì vậy tôi muốn nó chờ hơn một ngày (1000000 giây)! về mặt lý thuyết một chuỗi phải chạy _forever_ phải tiếp tục chạy trong một thời gian dài hơn rất nhiều so với _a số lượng rất cao của giây_ – pistacchio

+0

Chủ đề có thực hiện * bất kỳ điều gì hữu ích * khác ngoài chế độ ngủ hoặc bận không? Nếu không, bạn có thể chỉ cần làm đi với nó? Và nếu nó * là * làm một cái gì đó đáng giá, 'fess up! Đó là điều chúng ta cần biết để giúp bạn. –

Trả lời

7

Với yêu cầu khá kỳ lạ (một quá trình mà đi mãi mãi mà không sử dụng nhiều CPU), đây là một cách hợp lý nhỏ gọn:

import threading 
dummy_event = threading.Event() 
dummy_event.wait() 

... tuy nhiên, tôi sợ tôi sa vào sự cám dỗ để giải quyết Y của bạn chứ không phải của bạn X.

Bên cạnh đó, điều này sẽ không hoạt động nếu nền tảng của bạn không cung cấp mô-đun threading. Nếu bạn cố gắng thay thế mô-đun dummy_threading, thì trả lại dummy_event.wait() ngay lập tức.

Cập nhật: nếu bạn chỉ giữ một quá trình cha mẹ sẽ vì lợi ích của quy trình con của nó, bạn có thể sử dụng phương pháp wait() trên Popen objects, hoặc join() phương pháp trên Process đối tượng. Cả hai phương pháp này sẽ chặn vô thời hạn cho đến khi tiến trình con kết thúc. Nếu bạn đang sử dụng một số API subprocess khác, có ràng buộc là chức năng tương đương có sẵn. Nếu không, hãy lấy PID của quy trình và sử dụng os.waitpid().

2

Không sử dụng chờ đợi bận. Tùy thuộc vào những gì bạn đang chờ đợi, hãy sử dụng một trong các chức năng chờ chặn của hệ điều hành, ví dụ: select trên Unix và WaitForSingleObject/WaitForMultipleObjects trên Windows.

+0

cảm ơn câu trả lời.mặc dù, tôi không chờ đợi một điều. như câu hỏi ngụ ý, mục đích của quá trình là chạy _forever_ cho đến khi nó bị giết. – pistacchio

1

Nếu bạn dựa vào tập lệnh này để thực hiện bảo trì định kỳ, hãy sử dụng cron (UNIX) hoặc các tác vụ theo lịch (Windows).

Nếu bạn muốn đợi các quy trình con hoàn thành, hãy sử dụng os.waitpid.

Nếu bạn muốn đợi hoạt động của hệ thống tệp, hãy sử dụng pyinotify.

2

Vấn đề với việc ngủ trong một khoảng thời gian rất ngắn là gì? 1 mili giây gần với một máy tính hiện đại. Miễn là bạn không có hàng ngàn chủ đề này (có vẻ như bạn không), thì KHÔNG có gì sai khi ngủ một, mười, mười nghìn hoặc mười triệu mili giây mỗi lần lặp qua vòng lặp. CPU thậm chí sẽ không nhận thấy đốm nhỏ này.

Các vấn đề liên quan