2013-08-16 4 views
0

У меня есть файл python с классом httpHandler. я использую его с 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, когда соединение производится, уже другой поток. Я хочу отслеживать свои темы, что-то вроде обработки статистики. Однако я не могу получить доступ к моим переменным. Кроме того, мне нужно заблокировать их, чтобы они отображали реальные значения, а не что-то неопределенное правильно.

+0

Очень низкоуровневая идея будет создавать глобальный список и хранить в нем переменные. Но вы должны следить за тем, чтобы не писать один и тот же список одновременно с двумя разными потоками (как вы сказали, необходимо обеспечить блокировку), но если у вас есть только 2 потока (основной и некоторые рабочие), вы можете просто прочитать основной и просто писать с рабочим без проблем (и необходимость блокировки) - просто комментарий, потому что может быть лучший способ – Martin

+1

@Martin, из того, что я видел. Очереди кажутся дефактовым способом обмена информацией между потоки в python. – John

ответ

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')) 
+0

Не могли бы вы опубликовать простой пример? – John

+0

@johnthexiii здесь это – sanyi

Смежные вопросы