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

时间:2017-10-16 15:15:33

标签: python multithreading curses

嘿那里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的行,同时添加新行执行相同的操作。我该怎么做呢?在此先感谢:)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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