线程之间共享的Python全局变量(使用python-osc)

时间:2018-10-18 12:58:29

标签: python global python-multithreading osc

我在这里遇到线程问题。我需要线程来访问全局变量。

我已经读过一个类似问题的previous answer,并且我理解 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服务器在其自己的线程上运行。 像以前一样,我在与“ / learn ” OSC方法相关联的 mapped 函数内部将 a 声明为全局变量。

奇怪的是,以下代码与上一个代码的行为方式不同。

编辑于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 :(得分:2)

我认为这是因为“ ForkingOSCUDPServer”正在为每个OSC请求创建一个新进程,因此每次都将“ a”重新初始化。如果我将您的代码切换为使用“ ThreadingOSCUDPServer”,则似乎具有所需的行为。