2017-10-16 51 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的含義解釋它們,所以你通常不會看到它們。但是由於多線程問題,這些問題變得混雜且無效,其中一部分被打印到屏幕上。