Как поделиться глобалами в потоках и функциях Python - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть два файла для простой программы: 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' в функции, которая хотела прочитать или изменить глобальную переменную.Кажется, я не могу этого сделать здесь.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 26 ноября 2018

Чтобы объявить глобальный поток 2,

def thread2(threadname):
    global a
    while True:
        a += 1
        time.sleep(1)

В потоке 1 вам не нужно делать ничего особенного, если вы не пытаетесь изменить значение (которое может создатьлокальная переменная, которая скрывает глобальную переменную; если нужно, используйте глобальную переменную a)>

def thread1(threadname):
    #global a       # Optional if you treat a as read-only
    while a < 10:
        print a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...