仅在上下文中声明全局变量(with)

时间:2011-12-16 14:23:23

标签: python

我不知道是否可能,但我需要设置一个全局对象,但只在上下文中(带)

例如,我有2部分代码。第一个是读取和写入一些文件的工作对象。 但是工作者实际上并不知道这些文件的真实路径,所以我创建了一个包装器,用于将open打开到重定向文件路径。

问题在于我为工作者的每个任务(有自己的文件)创建了一个包装器。 我无法在工作期间为每个功能传递包装器。 允许工作函数通过包装器打开的最好方法是将其设置为全局,但我正在使用线程,我实际上无法将其设置为全局(可以同时设置多个包装器的多个任务)< / p>

我想要做的是这样的事情:

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()就可以做到,但是对于线程,我不知道当前上下文的“好”包装器是什么。

任何想法?

感谢

2 个答案:

答案 0 :(得分:0)

我认为解决问题的方法是传递wrapper对象。

如果这不切实际,您可以使用threading.local将全局变量设置为“线程本地”。但是,我认为第一种方法(通过wrapper)远远超过。

答案 1 :(得分:0)

您可能希望使用从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()