使用Python Curses进行线程处理会给我带来奇怪的字符?

问题描述 投票:0回答:2

嘿那里Stack Overflow。我正在尝试构建一个测试脚本,该脚本应该在多行上混合输出更改字符(使用curses)(随着时间的推移创建它们),根据线程编号创建新行。我有以下代码:

# -*- coding: utf-8 -*-
import curses, time, threading

def threadedFunction(linePos):
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()

    try:
        stdscr.clear()
        for i in range(50):
            stdscr.addstr(linePos, 0, "testing %s..." % i)
            stdscr.refresh()
            time.sleep(.1)
    finally:
        curses.echo()
        curses.nocbreak()
        curses.endwin()
        pass
    pass

if __name__ == "__main__":
    for x in xrange(0, 4): # should produce 5 lines maximum
        exec("process" + str(x) + " = threading.Thread(target = threadedFunction, args = (" + str(x) + ",))")
        exec("process" + str(x) + ".start()")

我以前尝试过使用multithreading库,但我没有希望。线程库至少会在它发疯之前在几行上显示我想要的数字。以下是我运行它时的功能示例:

Testing Python Curses with (incremental) Threading

我想要的只是让程序只是简单地启动一个新线程,并显示一个计数为50的行,同时添加新行执行相同的操作。我该怎么做呢?提前致谢 :)

python multithreading curses
2个回答
0
投票

从多个线程打印到终端将为您提供类似的混合输出。这是race condition的一个非常简单的例子。使用某种锁定机制来协调对终端的写入,或确保只从一个线程写入(例如,使用FIFO将消息传递给写入线程,写入线程将其写入终端)。

您看到的奇怪数字是ANSI escape sequences的一部分,程序使用它们来使用终端的特殊功能:例如,将\x1B[nF写入输出将使您的终端将光标向上移动一行。 Curses正在为您输出这样的代码,并且因为终端根据ANSI的含义解释它们,所以通常不会看到它们。但由于多线程问题,这些问题变得混杂无效,其中一部分被打印到屏幕上。


0
投票

即使您只在一个线程中使用curses,其他处理繁重的线程也可能会破坏curses线程中的转义序列。环境变量$ESCDELAY表示在发送转义码(0x1B)后等待多长时间(以毫秒为单位);如果超过该时间,则get_wch()返回^[击键(ESC)。

© www.soinside.com 2019 - 2024. All rights reserved.