Maintaining log file from multiple threads in Python
我有我的python basehttpserver服务器,它处理POST请求。我使用了线程混合,它现在为每个连接打开一个线程。我希望执行几个多线程操作,例如:1。通过为每个计数器添加1来监视成功/失败的连接活动。我需要一把锁。我的计数器在同一文件的全局范围内。我该怎么做?2。我希望处理某种类型的队列并将其写入一个文件,其中队列的内容是一组字符串,这些字符串是从我的不同线程写入的,它们只发送一些日志记录问题的信息。怎么做?因为我的线程是"幕后"完成的,所以我没能做到这一点,因为每次我使用do-post(..)方法时,我已经处于不同的线程中了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Succcessful_Logins = 0 Failed_Logins = 0 LogsFile = open(logfile) class httpHandler(BaseHTTPRequestHandler): def do_POST(self): .. class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): pass server = ThreadingHTTPServer(('localhost', PORT_NUMBER), httpHandler) server.serve_forever() |
这是我的服务器的一个小部件。另一件困扰我的事情是,我想首先将后响应发送回客户机,然后可能由于锁定机制或其他原因而延迟。
从代码来看,似乎每个线程中都构造了一个新的httphandler?如果是这种情况,您可以使用一个类变量作为计数,使用一个互斥量来保护计数,如下所示:
1 2 3 4 5 6 7 8 9 10 | class httpHandler(...): # Note that these are class variables and are therefore accessable # to all instances numSuccess = 0 numSuccessLock = new threading.Lock() def do_POST(self): self.numSuccessLock.aquire() self.numSuccess += 1 self.numSuccessLock.release() |
对于从不同线程写入文件,有几个选项: