2013-08-16 216 views
0

我有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的類,一旦連接成功,已經在一個不同的線程。 我想跟蹤我的線程,某種統計處理。 但是我不能訪問我的變量。 此外,我需要鎖定它們,以便它們代表真實值,而不是未定義的正確值。

+0

一個非常低級的想法是創建一個全局列表和存儲變量。但是你必須小心不要在兩個不同的線程同時寫同一個列表(正如你所說的需要提供一個鎖),但是如果你只有兩個線程(main和一個工作線程),你可以用主要和剛剛寫工作沒有麻煩(和需要鎖) - 只是一個評論becaus可能有更好的方式 – 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