嘿那里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
库,但我没有希望。线程库至少会在它发疯之前在几行上显示我想要的数字。以下是我运行时的功能示例:
我想要的只是让程序只是简单地启动一个新线程,并显示一个计数为50的行,同时添加新行执行相同的操作。我该怎么做呢?在此先感谢:)
答案 0 :(得分:0)
从多个线程打印到终端将为您提供混合输出。这是race condition的一个非常简单的例子。使用某种锁定机制来协调对终端的写入,或确保只从一个线程写入(例如,使用FIFO将消息传递给写入线程,写入线程将其写入终端)。
您看到的奇怪数字是程序用来使用终端特殊功能的ANSI escape sequences的一部分:将\x1B[nF
写入输出将使终端将光标向上移动一行,例如。 Curses正在为你输出这样的代码,并且因为终端根据ANSI的含义解释它们,所以你通常不会看到它们。但由于多线程问题,这些问题变得混杂无效,部分内容会被打印到屏幕上。
答案 1 :(得分:0)
即使仅在一个线程中使用curses,其他处理繁重的线程也可能破坏curses线程中的转义序列。环境变量$ESCDELAY
指示发送转义码(0x1B)之后要等待的时间(以毫秒为单位);并且如果超过了该时间,get_wch()将返回^[
击键(ESC)。