2012-03-18 30 views
5

Tôi gặp sự cố khi xây dựng hàm đuôi gevent. Nói chung, mã hoạt động khi tôi nhận xét gevent.sleep trong vòng lặp, nhưng sau đó sử dụng CPU là 100%. Khi tôi rời khỏi chương trình gevent.sleep hoạt động nhưng không có gì xảy ra. Phiên bản Gevent là 1.0b1.Cách kết nối tệp với gevent

import os 
import gevent 

def follow(filename): 
    fd = os.open(filename, os.O_RDONLY|os.O_NONBLOCK) 
    os.lseek(fd, 0, os.SEEK_END) 
    hub = gevent.get_hub() 
    watcher = hub.loop.io(fd, 1) 
    while True: 
     hub.wait(watcher) 
     lines = os.read(fd, 4096).splitlines() 
     if not lines: 
      #gevent.sleep(.1) 
      continue 
     else: 
      for line in lines: 
       print "%s:%s" % (filename, line) 

    os.close(fd) 

if __name__ == '__main__': 
    job1 = gevent.spawn(follow, '/var/log/syslog') 
    job2 = gevent.spawn(follow, '/var/log/messages') 

    gevent.joinall([job1, job2]) 
+0

Nếu bạn tìm thấy một câu trả lời, gửi nó như một câu trả lời (và chấp nhận nó một lần bạn có thể) – MByD

Trả lời

3

Cách tiếp cận rõ ràng là sai. Điều này hoạt động hoàn hảo:

import os 
import gevent 

def follow(filename): 
    fd = os.open(filename, os.O_RDONLY|os.O_NONBLOCK) 
    os.lseek(fd, 0, os.SEEK_END) 
    while True: 
     lines = os.read(fd, 4096).splitlines() 
     if not lines: 
      gevent.sleep(.5) 
      continue 
     else: 
      for line in lines: 
       print "%s:%s" % (filename, line) 

    os.close(fd) 

if __name__ == '__main__': 
    job1 = gevent.spawn(follow, '/var/log/syslog') 
    job2 = gevent.spawn(follow, '/var/log/messages') 

    gevent.joinall([job1, job2]) 
+0

1 cho đăng tải đang –

2

Vâng, đó là mã không 'đuôi' tệp, nó chỉ in toàn bộ tệp, NHƯNG nó hiển thị cách 'loop.stat' hoạt động. Nó chờ đợi cho tập tin để thay đổi - hoặc chỉ cần chạm vào, và sau đó in nội dung. Khi nó chờ đợi - nó hầu như không có tài nguyên!

import gevent,os 

def follow(filename): 
    hub = gevent.get_hub() 
    watcher = hub.loop.stat(filename) 
    while True: 
     hub.wait(watcher) 
     with open(filename) as f: 
      print f.read() 

if __name__ == '__main__': 
    jobs=[gevent.spawn(follow,'/var/log/syslog')] 
    jobs+=[gevent.spawn(follow,'/var/log/messages')] 
    gevent.joinall(jobs) 
+0

1 làm việc: Cảm ơn Josh này là gần như chính xác những gì tôi cần. Tôi có một máy chủ ZeroRPC (sử dụng Gevent) và tôi cần theo dõi toàn bộ thư mục cho cả các tệp mới và sửa đổi các tệp hiện có. Googling của tôi là không cho tôi, bạn có thể cho tôi bất kỳ con trỏ/đoạn mã :) –

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