У меня есть два файла для простой программы: MyConfig.py:
class MyConfig(object):
a = False
b = 0
И mytest.py:
import sys
# Globals
sys.path.append('.')
from MyConfig import MyConfig
def test():
MyConfig.a = False
MyConfig.b = 32
print("MyConfig.a = {}".format(MyConfig.a))
print("MyConfig.b = {}".format(MyConfig.b))
if __name__ == '__main__':
if len(sys.argv) == 2:
MyConfig.a = True
MyConfig.b = int(sys.argv[1])
print("MyConfig.a = {}".format(MyConfig.a))
print("MyConfig.b = {}".format(MyConfig.b))
test()
Вывод:
MyConfig.a = True
MyConfig.b = 3
MyConfig.a = False
MyConfig.b = 32
Это кажется извилистым способом поделиться некоторой информацией о конфигурации, но я не могу сделать то же самое в многопоточном приложении Python.В этом приложении MyConfig.x MyConfig.y и MyConfig.z назначаются при запуске.
Если я делаю то же самое, в threadapp.py:
import sys
# Globals
sys.path.append('.')
from MyConfig import MyConfig
# Some functions used by the app
...
def data_export(queue):
...
def worker(queue):
...
def process(data, foo):
...
def thread(iterator):
processes = []
data = Queue()
data_factory = Process(target = data_export, args = (data,))
data_factory.daemon = True
processes.append(data_factory)
data_factory.start()
work = Process(target = worker, args = (data,))
work.daemon = True
processes.append(work)
work.start()
data_factory.join()
def main():
cfg = MyConfig()
if len(sys.argv) == 2:
cfg.a = True
cfg.b = int(sys.argv[1])
print ("cfg.a = {}".format(cfg.a))
print ("cfg.b = {}".format(cfg.b))
try:
pool = ThreadPool(processes = multiprocessing.cpu_count()*2)
pool.map(thread, range(0, 10))
except:
pool.close()
exit()
if __name__ == '__main__':
main()
Моя проблемав том, что я не могу получить доступ к глобальному MyConfig (cfg) нигде в функциях, которые используют потоки.Когда я запускаю программу, я вижу, что переменные устанавливаются в cfg., В main (), но когда я пытаюсь получить к ним доступ в функциях, которые используют потоки, все они устанавливаются в их значения по умолчанию, и я не могу установитьих и прочитайте обратно.
Я искал это часами без удачи, только с простыми глобальными переменными, где я объявил бы 'global foo' в функции, которая хотела прочитать или изменить глобальную переменную.Кажется, я не могу этого сделать здесь.
Любая помощь приветствуется.