Python的线程诅咒给我怪异的字符?
问题描述:
嘿有堆栈溢出。我正在尝试构建一个测试脚本,该脚本应该在多行(随时间创建它们)上混合输出不断变化的字符(使用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
库试过,但我与它没有希望。线程库至少会在疯狂之前在几行显示我想要的数字。这里是做什么的一个例子,当我运行它:
所有我想要的是程序只是简单地开始一个新的线程,并显示计数到50,同时增加新的生产线做一个线一样。我将如何去做这个?在此先感谢:)
答
从多个线程打印到终端将给你这样的混合输出。这是一个非常简单的例子race condition。使用某种锁定机制来协调写入终端,或确保只从一个线程写入(例如,使用FIFO将消息传递到写入线程,这会将它们写入终端)。
您看到的奇怪数字是ANSI escape sequences的一部分,程序使用它来使用终端的特殊功能:例如,将\x1B[nF
写入输出将使您的终端将光标向上移动一行。 Curses正在为你输出这样的代码,并且由于终端根据ANSI的含义解释它们,所以你通常不会看到它们。但是由于多线程问题,这些问题变得混杂且无效,其中一部分被打印到屏幕上。
只是一个想法,我不熟悉stdscr的东西,但在这一行stdscr.addstr(linePos,0,“testing%s ...”%i)你不叫str(i)。你有没有试过这种方式? – Jeff
@Jeff是的,我有,它不会改变任何东西;不幸的是仍然有错误。 –
可能重复[curses在python getstr()刷新时](https://*.com/questions/8569878/curses-in-python-getstr-while-refreshing) –