【问题标题】:Accessing global variables from within a thread从线程内访问全局变量
【发布时间】:2013-08-17 22:54:11
【问题描述】:

我有带有 httpHandler 类的 python 文件。 我将它与 ThreadingMixIn 一起使用,如下所示:

from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
Successful_Attempts = 0
Failed_Attempts = 0

class httpHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        .....


class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
    pass

后来我按如下方式启动它:

server = ThreadingHTTPServer(('localhost', PORT_NUMBER), httpHandler)
        print 'Started httpserver on port ' , PORT_NUMBER

据我所知,httpHandler 类一旦建立连接,就已经在另一个线程中了。 我想跟踪我的线程,某种统计处理。 但是我无法访问我的变量。 另外,我需要锁定它们,以便它们代表真实值,而不是未正确定义的东西

【问题讨论】:

  • 一个非常底层的想法是创建一个全局列表并在其中存储变量。但是你必须注意不要用两个不同的线程同时写同一个列表(正如你所说的需要提供一个锁)但是如果你只有 2 个线程(主线程和一些工作线程)你可以读main 并且只需使用正常工作的人写就不会遇到麻烦(并且需要锁定) - 只是一个评论,因为可能有更好的方法
  • @Martin,从我所见,队列似乎是在 python 中的线程之间共享信息的事实上的方式。

标签: python python-multithreading


【解决方案1】:

我会为此使用线程安全的单例。

编辑: johnthexiii 建议我应该发布一个简单的示例,所以就在这里。它不完全是单例,而是模仿单例,类变量在每个应用程序中都是全局的,因此我们直接使用该类来实例化一个单例类,调用它的类方法。

from threading import Lock


class ThreadSafeGlobalDataContainer:
    __container = {}
    __lock = Lock()

    @classmethod
    def set(cls, name, value):
        with cls.__lock:
            cls.__container[name] = value

    @classmethod
    def get(cls, name):
        with cls.__lock:
            return cls.__container[name]


#in some thread
ThreadSafeGlobalDataContainer.set('someName', 'someValue')

#somewhere else
print(ThreadSafeGlobalDataContainer.get('someName'))

【讨论】:

  • 你能发一个简单的例子吗?
  • @johnthexiii 在这里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多