2012-05-22 2 views
3

Я имею странное поведение системы при использовании IOLoop экземпляра PyZMQ в:ZMQ IOLoop экземпляр запись/чтение рабочего

def main(): 
    context = zmq.Context() 
    s = context.socket(zmq.REP) 
    s.bind('tcp://*:12345') 
    stream = zmqstream.ZMQStream(s) 
    stream.on_recv(on_message) 

    io_loop = ioloop.IOLoop.instance() 
    io_loop.add_handler(some_file.fileno(), on_file_data_ready_read_and_then_write, io_loop.READ) 
    io_loop.add_timeout(time.time() + 10, another_handler) 
    io_loop.start() 

def on_file_data_ready_read_and_then_write(fd, events): 
    # Read content of the file and then write back 
    some_file.read() 
    print "Read content" 
    some_file.write("blah") 
    print "Wrote content" 

def on_message(msg): 
    # Do something... 
    pass 

if __name__=='__main__': 
    main() 

В основном цикл событий слушает zmq порт 12345 для JSON запросов и считывает содержимое из файла когда это доступно (и когда это происходит, манипулируйте им и прикладывайте к нему обратно). В основном файл представляет собой специальный модуль/proc/kernel, который был создан для этого).

Все работает хорошо, но, по какой-то причине, если смотреть на Трассирование я вижу следующее:

... 
1. read(\23424) <--- Content read from file 
2. write("read content") 
3. write("Wrote content") 
4. POLLING 
5. write(\324324) # <---- THIS is the content that was sent using some_file.write() 
... 

Так что похоже на запись в файл не было сделано в порядке сценария питона, но системный вызов записи в этот файл был выполнен ПОСЛЕ опроса, хотя это должно было быть сделано между строками 2 и 3.

Любые идеи?

ответ

1

Похоже, вы столкнулись с проблемой кэширования. Если some_file является файлом, подобным объекту, вы можете попробовать явно вызвать .flush() на нем, то же самое для ZMQ Socket, который также может содержать сообщения по соображениям эффективности.

Как указано, содержимое файла очищается, когда ссылка some_file содержит сбор мусора.

Дополнительно:

использовать логику контекста менеджера, что новые версии Python обеспечения с открытым()

with open("my_file") as some_file: 
    some_file.write("blah") 

Как только он заканчивает этот контекст, some_file будет автоматически покраснел и закрыты.