2012-12-16 109 views
2

我有Apache2的一个WSGI应用程序,写入日志文件,在最简单的方式:写并发日志文件

def log (msg): 
    with open (LOGFILE, 'a') as f: f.write (msg) 

在我的沙箱环境中能正常工作,不过我有点担心并发。如果apache2运行各种线程,我是否必须担心并发问题?也许我的日志文件可能会乱码?如果另一个线程已经在记录,可能会调用log (msg)失败?如果是这种情况,我会如何防止它?

编辑: 为了进行测试,我从两个壳运行在同一时间两个脚本:

#! /usr/bin/python3.2 

def log(): 
    with open ('log', 'a') as f: 
     f.write ('message from thread A\n') 

while (True): log() 

#! /usr/bin/python3.2 

def log(): 
    with open ('log', 'a') as f: 
     f.write ('message from thread B\n') 

while (True): log() 

日志文件看起来不错,没有出现错误。我很幸运,或者从两个不同的线程写入同一个文件是安全的。文件系统是ext4。

+0

为什么不使用Python记录模块? http://docs.python.org/2/library/logging.html – Jeff

+0

太好了。特别是这一行:“日志记录模块是为了线程安全的,不需要客户端做任何特殊的工作,它通过使用线程锁来实现这一点;有一个锁来序列化访问模块的共享数据,每个处理程序还会创建一个锁来序列化对其基础I/O的访问。“发布它作为答案,以便我可以接受它。 – Hyperboreus

回答

0

写入文件,追加模式确保在Linux操作系统原子,所以没有出错