[英]Declare a global variable only in a context (with)
我不知道是否可能,但是我需要設置一個全局對象,但只能在上下文中(帶有)
例如,我有2部分代碼。 第一個是讀取和寫入一些文件的輔助對象。 但是工作人員實際上並不知道這些文件的真實路徑,因此我創建了一個包裝程序,用於將打開文件重定向到良好的文件路徑。
問題是我為工作者的每個任務(帶有自己的文件)創建了一個包裝器。 在工作期間,我無法通過每個功能的包裝。 允許通過包裝器打開工作功能的最佳方法是將其設置為全局,但是我正在使用線程,而實際上無法將其設置為全局(可以同時設置多個包裝器的多任務)
我想要做的是這樣的事情:
with init_current_wrapper(task) as wrapper: # do_some_magic_for_set_it_global(wrapper)
do_some_jobs_for_this(task) # all process inside can access THIS wrapper
在“ do_some_jobs_for_this()”下的過程中,我可以做
wrapper = get_current_wrapper()
wrapper.open("fakefilename")
#blablabla
沒有線程,一個簡單的OSWrapper.get_current()可以做到,但是有了線程,我不知道當前上下文的“好”包裝是什么。
任何想法 ?
謝謝
我認為,解決您問題的干凈方法是傳遞wrapper
對象。
如果這不切實際,則可以使用threading.local
將全局變量設置為“ thread-local”。 但是,我認為第一種方法(繞過wrapper
)要好得多。
可能不希望使用包裝對象將文件名傳遞給每個線程,而是要使用從Queue.Queue
對象獲取文件名的工作線程池,如以下示例所示:
import threading
import time
from Queue import Queue
NUM_FILES = 10
NUM_WORKERS = 3
queue = Queue()
def worker():
print 'Thread started'
while True:
filename = queue.get()
print 'Opening file:', filename
# Do something with the file
time.sleep(1)
print 'Closing file:', filename
queue.task_done()
for i in range(NUM_WORKERS):
thread = threading.Thread(target=worker)
thread.daemon = True
thread.start()
filenames = ['filename-{0}'.format(i)
for i in range(NUM_FILES)]
for filename in filenames:
queue.put(filename)
queue.join()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.