2016-10-13 8 views
0

Мне нужно обмениваться переменными между несколькими модулями. Эти переменные будут изменены асинхронно потоками по мере запуска программы.Как передать переменные переменные через модули Python?

Мне нужно иметь доступ к большинству resent-состояний переменной несколькими модулями одновременно.

Несколько модулей также будут записывать одну и ту же переменную.

В основном то, что мне нужно, - это разделяемое пространство памяти, такое как глобальное var внутри модуля, но доступно & асинхронно сменяется всеми другими модулями.

Я знаком с блокировкой глобальной переменной внутри модуля. Я не знаю, с чего начать это через несколько модулей.

Как это сделать?

+0

это может помочь. http://stackoverflow.com/questions/142545/python-how-to-make-a-cross-module-variable – dunder

+0

Любые непреднамеренные последствия? И/или я предполагаю, что var можно заблокировать при изменении __builtin__ var? Так ли это вообще делается? – Emily

+0

Вы можете посмотреть, как это делается для 'django.settings' vars. Я думаю, что так должно быть. Поддержание родительского модуля для таких переменных. – dunder

ответ

1

Поместите все ваши глобальные переменные в модуле, например config.py и импортировать его на протяжении ваших модулей:

config.py:

a=None 
varlock=None 

main.py:

import config 
import threading 

config.a = 42 
config.varlock = threading.RLock() 
... 

Затем вы можете использовать экземпляр глобальной блокировки, созданный один раз в вашем главном, для защиты ваших переменных. Каждый раз, когда вы изменяете один из них в любом из ваших потоков, делайте это как

with config.varlock: 
    config.a = config.a + 42 

и все должно быть в порядке.

Hannu

+0

Зачем создавать экземпляры в главном? Любая причина не содержать все в config.py, а затем импортировать конфиг во все модули? – Emily

+0

Не имеет значения, если вы создаете экземпляр RLock только один раз. Если вы сделаете это неправильно, вы можете создать несколько экземпляров блокировки, и в этом случае они не будут работать. Я использую глобальные переменные и потоки довольно много, и мой modus operandi должен включать config.py везде, в main.py создавать экземпляры всех блокировок, а затем запускать потоки и отключать. Это гарантирует отсутствие параллелизма при настройке тех вещей, которые должны быть глобальными и «статическими», например, блокировками. – Hannu