2011-01-24 26 views
6

Sự cố

Tôi dự kiến ​​tập lệnh bên dưới sẽ in tối đa một sự kiện và sau đó dừng (chỉ được viết để minh họa sự cố).Việc bỏ phiếu cho một tệp để thay đổi hoạt động như thế nào?

#!/usr/bin/env python 

from select import poll, POLLIN 

filename = "test.tmp" 

# make sure file exists 
open(filename, "a").close() 

file = open(filename, "r+") 

p = poll() 
p.register(file.fileno(), POLLIN) 

while True: 
    events = p.poll(100) 
    for e in events: 
     print e 
     # Read data, so that the event goes away? 
     file.read() 

Tuy nhiên, nó in khoảng 70000 sự kiện mỗi giây. Tại sao?

Bối cảnh

Tôi đã viết một lớp học sử dụng lớp pyudev.Monitor nội bộ. Trong số những thứ khác, nó thăm dò ý kiến ​​các fileno được cung cấp bởi các fileno() phương pháp cho những thay đổi bằng cách sử dụng một poll object. Bây giờ tôi đang cố gắng viết một bài kiểm tra đơn vị cho lớp của tôi (tôi nhận ra tôi phải viết bài kiểm tra đơn vị trước, vì vậy không cần phải chỉ ra nó), và do đó tôi cần phải viết fileno của riêng mình () cho đối tượng pyudev.Monitor giả của tôi, và tôi cần điều khiển nó để tôi có thể kích hoạt đối tượng thăm dò ý kiến ​​để báo cáo một sự kiện. Như các mã trên chứng minh, tôi không thể làm cho nó ngừng báo cáo dường như không tồn tại sự kiện!

Tôi có thể tìm thấy không có sự thừa nhận() hoặc tương tự trong lớp bình chọn để làm cho sự kiện biến mất (tôi nghi ngờ chỉ có một sự kiện bằng cách nào đó bị kẹt), tìm kiếm google và trang web này đã mang lại không có gì. Tôi đang sử dụng python 2.6.6 trên Ubuntu 10.10.

Trả lời

3

Bạn sẽ có may mắn hơn bằng cách sử dụng đường ống thay vì tệp. Hãy thử thay vào đó:

#!/usr/bin/env python 
import os 
from select import poll, POLLIN 

r_fd, w_fd = os.pipe() 

p = poll() 
p.register(r_fd, POLLIN) 

os.write(w_fd, 'X') # Put something in the pipe so p.poll() will return 

while True: 
    events = p.poll(100) 
    for e in events: 
     print e 
     os.read(r_fd, 1) 

Điều này sẽ in ra sự kiện bạn đang tìm kiếm. Để kích hoạt sự kiện thăm dò ý kiến, tất cả những gì bạn phải làm là ghi một byte vào bộ mô tả tệp có thể ghi.

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