Глобальная переменная Python, разделяемая между потоками (используя python-osc) - PullRequest
0 голосов
/ 18 октября 2018

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

Я прочитал предыдущий ответ на похожий вопрос, и я понял "силу" ключевого слова 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)

Большое спасибо за вашу поддержку.

1 Ответ

0 голосов
/ 24 октября 2018

Я думаю, что ForkingOSCUDPServer создает новый процесс для каждого запроса OSC, поэтому каждый раз инициализируется a.Если я переключу ваш код на использование ThreadingOSCUDPServer, он, похоже, будет иметь желаемое поведение.

...