Python 诅咒、线程 : Output thread reports a lagging value for global variable

标签 python multithreading python-curses

我从一个带有curses的python程序开始,然后我实现了线程,一个线程接受输入(这里是A和D按钮)并相应地更改x。然后主 block 不断地将 x 的值显示到屏幕上。但是,x(全局共享变量)的值不同。特别是,主 block 测量的 x 值总是滞后于 inputThread 的值,但 inputThread 的响应是完美的。是什么赋予了?如何让主 block 读取由 inputThread 测量的 x 的真实值?

import time
import curses
import threading
from curses import wrapper
from time import sleep

def inputThread(stdscr):
    global x
    x = 0
    while True:
        c = stdscr.getch()
        curses.flushinp()
        if c == ord('a'):
            x -= 1
        elif c == ord('d'):
            x += 1
        stdscr.addstr("inputThread:" + str(x) + "\n" + "c:" + str(c))

def main(stdscr):
    curses.initscr()
    stdscr.clear()

    t = threading.Thread(target=inputThread, args=(stdscr,))
    t.setDaemon(True)
    t.start()

    while True:

        stdscr.clear()
        stdscr.addstr("\ndisplay window:" + str(x) + "\n")
        time.sleep(0.05)

wrapper(main)

示例输出;下一次按键时,无论是 A 还是 D,显示窗口将报告 9。

最佳答案

首先,您的全局变量x应该在所有函数之外声明,但您已在inputThread函数内部声明了它。 global x 告诉我们,它将使用并更改全局变量 x 的值,而不是在函数作用域内创建另一个变量。因此 delcare 并在其他函数之外用 0 初始化 x

现在你的问题来了。假设当守护进程和主线程一起运行时,守护进程方法只是停留在 c = stdscr.getch() 等待按键,而 while 在你的内部循环。主线程中的 main 函数什么也不做,只是用文本 display window: 0 更新屏幕,您看不到它,因为屏幕在 0.05s 内变得清晰FPS 太快看不清屏幕。
现在,当您键入这些 a 或 d 键时,守护进程会更新全局变量 x 的值,但在主线程获取该值之前,它会被打印虚拟屏幕为 InputThread:*c:***,在这种情况下,主线程仅打印先前的值 0。因此,解决方法是在更新 x 后让守护线程休眠一段时间,同时主线程内的循环将导致显示新更新的 x 值。这可以通过以下方式完成:

import time
import curses
import threading
from curses import wrapper
from time import sleep

x = 0

def inputThread(stdscr):
    global x
    while True:
        c = stdscr.getch()
        curses.flushinp()
        if c == ord('a'):
            x -= 1
        elif c == ord('d'):
            x += 1
        sleep(0.05)
        stdscr.addstr("inputThread:" + str(x) + "\n" + "c:" + str(c))

def main(stdscr):
    curses.initscr()
    stdscr.clear()

    t = threading.Thread(name ='daemon', target=inputThread, args=(stdscr,))
    t.setDaemon(True)
    t.start()

    while True:
        stdscr.clear()
        stdscr.addstr("\ndisplay window:" + str(x) + "\n")
        sleep(0.05)

wrapper(main)

希望有帮助。

关于Python 诅咒、线程 : Output thread reports a lagging value for global variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180414/

相关文章:

python - JupyterLab 3.0.16 : Exporting HTML results on "Blocking request with no referer" and "403 Blocking request from unknown origin"

c - 在 C++ 中并行化素数生成器

python - 在 python curses 中换行输出

python - 标准库中某处是否有 ANSI 颜色转义码列表?

python - 如何在 python-curses 中启用鼠标移动事件

python - 使用 python 运行 bash 脚本 - TypeError : bufsize must be an integer

python - AWS Lambda [错误]函数接受 1 个位置参数,但给出了 2 个

c - Linux内核中wake_up_sync/wake_up_interruptible_sync的用途

python - 如何终止选定的线程

python - 如何标准化 scikit learn 中的排名数据?