【问题标题】:Python global variable shared between threads (using python-osc)线程之间共享的 Python 全局变量(使用 python-osc)
【发布时间】:2019-03-23 07:09:15
【问题描述】:

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

我已经阅读了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 服务器在自己的线程上运行。 和以前一样,我已将 a 声明为与“/learn”OSC 方法关联的 mapped 函数内的全局变量。

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

于 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)

非常感谢您的支持。

【问题讨论】:

  • 您确定value 确实具有您期望的价值吗?
  • 嗨@astorga,是的。在我之前进行的一些测试中,我在menageLearnButton 中放置了一个打印件,以进行完全相同的检查。但是,这里还有一个 else 语句,它应该增加 a 变量,而不管 value 的值如何。

标签: python global python-multithreading osc


【解决方案1】:

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

【讨论】:

  • 谢谢@RawBengal,你是对的!感谢您的宝贵支持,请原谅我迟到的回复:)
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多