У меня есть класс Indexer
, который создается из основного потока, экземпляр этого класса хранится в переменной, скажем, indexer
. watchdog.observers.Observer()
наблюдает за изменениями в каталогах, которые происходят в другом потоке. Я попытался передать эту переменную indexer
из основного потока через мой обработчик Vigilante
, который был передан в ob.schedule(Vigilante(indexer))
вместе с некоторыми другими переменными из основного потока. Я не могу получить доступ к переменной indexer
в Vigilante class
из-за нахождения в разных потоках. Я знаю, что могу использовать Queue
, но я не знаю, как передать Queue
нити сторожевого таймера.
Вот код из основного потока:
if watch:
import watchdog.observers
from .utils import vigilante
class callbacks:
def __init__(self):
pass
@staticmethod
def build(filename, response):
return _build(filename, response)
@staticmethod
def renderer(src, mode):
return render(src, mode)
handler = vigilante.Vigilante(_filter, ignore, Indexer, callbacks, Mode)
path_to_watch = os.path.normpath(os.path.join(workspace, '..'))
ob = watchdog.observers.Observer()
ob.schedule(handler, path=path_to_watch, recursive=True)
ob.start()
import time
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
ob.stop()
Indexer.close()
ob.join()
Indexer class
предназначен для записи в базу данных из другой части кода, где был создан экземпляр Indexer
.
Вот код из Vigilante
класса, работающего в потоке сторожевого таймера:
class Vigilante(PatternMatchingEventHandler):
"""Helps to watch files, directories for changes"""
def __init__(self, pattern, ignore, indexer, callback, mode):
pattern.append("*.yml")
self.Callback = callback
self.Mode = mode
self.Indexer = indexer
super(Vigilante, self).__init__(patterns=pattern, ignore_directories=ignore)
def vigil(self, event):
print(event.src_path, 'modified')
IndexReader = self.Indexer.get_index_on(event.src_path)
dep = IndexReader.read_index()
print(dep.next(), 'dependency')
feedout = self.Callback.build(
os.path.basename(event.src_path)
,self.Callback.renderer(event.src_path, self.Mode.FILE_MODE)
)
def on_modified(self, event):
self.vigil(event)
def on_created(self, event):
self.vigil(event)
Все, что мне нужно, - это способ передать эти переменные из основного потока в поток сторожевого таймера через класс Vigilante