我不知道是否可能,但我需要设置一个全局对象,但只在上下文中(带)
例如,我有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()就可以做到,但是对于线程,我不知道当前上下文的“好”包装器是什么。
任何想法?
感谢
答案 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()