0

我有我的 python baseHTTPServer 服务器,它处理发布请求。我使用了 ThreadingMixIn,它现在为每个连接打开一个线程。我希望执行几个多线程操作,例如: 1. 通过为每个计数器添加 1 来监视成功/失败的连接活动。我需要一把锁。我的计数器在同一个文件的全局范围内。我怎样才能做到这一点?2. 我希望处理某种队列并将其写入文件,其中队列的内容是一组字符串,从我的不同线程写入,它只是发送一些用于记录问题的信息。怎么做到呢?我无法做到这一点,因为我的线程是在“幕后”完成的,因为每次我在 do_POST(..) 方法中,我已经在不同的线程中。

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()

这是我的服务器的一个小脆弱。困扰我的另一件事是我想首先将发布响应发送回客户端,然后才可能由于锁定机制或其他原因而延迟。

4

1 回答 1

0

从您的代码中,看起来每个线程中都构造了一个新的 httpHandler ?如果是这种情况,您可以使用类变量进行计数,并使用互斥锁来保护计数,例如:

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()

至于从不同线程写入文件,有几个选项:

  1. 使用日志模块,“日志模块旨在实现线程安全,无需其客户端完成任何特殊工作。” 来自http://docs.python.org/2/library/logging.html#thread-safety
  2. 使用上面的 Lock 对象来序列化对文件的写入
  3. 使用线程安全队列将写入排队,然后从队列中读取并从单独的线程写入文件。有关示例,请参见http://docs.python.org/2/library/queue.html#module-Queue
于 2013-08-16T19:00:18.020 回答