Я застрял здесь с поточностью.Мне нужны потоки для доступа к глобальной переменной.
Я прочитал предыдущий ответ на похожий вопрос, и я понял "силу" ключевого слова global впорядок доступа функций и потоков к глобальным переменным.
Я могу заставить работать следующий код, и он довольно прост для меня:
# WORKING CODE !!!
from threading import Thread
import sys, time
a = "" #global variable
def thread1(threadname):
global a
while True:
a *= 2
time.sleep(2)
def thread2(threadname):
global a
while True:
a += 1
time.sleep(1)
if __name__ == "__main__":
thread1 = Thread( target=thread1, args=("Thread-1", ) )
thread2 = Thread( target=thread2, args=("Thread-2", ) )
a = 23
thread1.start()
thread2.start()
while True:
print(a)
Теперь я хотел бы получитьуправляемая OSC функция для изменения глобальной переменной a .Я использую модуль python-osc и заставляю сервер OSC работать в своем собственном потоке.Как и прежде, я объявил a в качестве глобальной переменной внутри сопоставленной функции , связанной с методом OSC " / learn ".
Странномое понимание следующего кода не ведет себя так же, как предыдущий.
отредактировано 2018-10-18, 16: 14 : " a " вообще не увеличивается, и то, что я вижу, напечатано
a: 1
печатается непрерывно.Как будто у нас было два разных значения "a ": одно, которое увеличивается внутри потока OSC, которое отличается от глобального " a " основного.
Что я делаю не так?
import threading
from time import sleep
from pythonosc import osc_server, dispatcher
OSCaddress = "192.168.1.68"
OSCport = 13000
a = ""
# OSC functions
def menageLearnButton(unused_addr, args, value):
global a
if value == 1:
a += 1
else:
a += 3
if __name__ == "__main__":
# OSC dispatcher to respond to incoming OSC messages
dispatcher = dispatcher.Dispatcher()
dispatcher.map("/learn", menageLearnButton, "learning")
a = 1
# better to run the OSC server on its own thread
# in order not to block the program here
OSCserver = osc_server.ForkingOSCUDPServer((OSCaddress, OSCport), dispatcher)
OSCserver_thread = threading.Thread(target=OSCserver.serve_forever)
OSCserver_thread.start()
while True:
print("a: {}".format(a))
sleep(1)
Большое спасибо за вашу поддержку.