簡體   English   中英

僅在上下文中聲明全局變量(帶有)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM