使用PyZMQ的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()
基本上,事件循环监听12345的zmq端口以获取JSON请求,并在可用时从文件中读取内容(当它执行时,操作它并将其归还给它。基本上该文件是一个特殊的/ proc /内核模块那是为此而建的。)
一切运作良好但是,出于某种原因,在查看strace时我会看到以下内容:
...
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()
...
所以看起来写文件没有按照python脚本的顺序完成,但写入该文件的系统调用是在轮询之后完成的,即使它应该在第2行和第3行之间完成。
有什么想法吗?
答案 0 :(得分:1)
看起来你遇到了缓存问题。如果some_file是一个像object这样的文件,你可以尝试在它上面显式调用.flush(),ZMQ Socket也是如此,它也可以出于效率的原因保存消息。
目前,当some_file引用被垃圾收集时,文件的内容被刷新。
其他:
使用新版本的Python提供的上下文管理器逻辑open()
with open("my_file") as some_file:
some_file.write("blah")
一旦完成此上下文,some_file将自动刷新并关闭。