2017-10-16 49 views
1

嘿有堆栈溢出。我正在尝试构建一个测试脚本,该脚本应该在多行(随时间创建它们)上混合输出不断变化的字符(使用curses),并根据线程号创建新行。 我有下面的代码:Python的线程诅咒给我怪异的字符?

# -*- 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,同时增加新的生产线做一个线一样。我将如何去做这个?在此先感谢:)

+0

只是一个想法,我不熟悉stdscr的东西,但在这一行stdscr.addstr(linePos,0,“testing%s ...”%i)你不叫str(i)。你有没有试过这种方式? – Jeff

+0

@Jeff是的,我有,它不会改变任何东西;不幸的是仍然有错误。 –

+0

可能重复[curses在python getstr()刷新时](https://stackoverflow.com/questions/8569878/curses-in-python-getstr-while-refreshing) –

回答

0

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

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