多线程时Python诅咒

时间:2014-12-03 11:27:58

标签: python multithreading curses

我有一个用Python编写的多线程程序,我在同一时间发生了很多事情:

  • 从外部来源读取原始数据
  • 将此类数据组织到不同的列表中(解析)
  • 将解析后的数据保存到大容量存储中
  • 一些线程被用于不时刷新一些缓冲区和其他优化
  • 使用Curses显示部分此类数据以进行实时监控。

该程序对延迟敏感,所以我真的需要这个多线程。 我得到了curses线程以正确显示我想要的内容。

问题在于,虽然我没有使用curses线程工作,但是我在main()函数中有一个“killswitch”,它在按下一个键时终止了所有活动。 我有一个名为“killThreads”的全局变量,它被用作所有被称为线程的函数,所有这些函数只能用作:

def oneThread():
    while (not killThreads):
        doStuff()
        ...

然后main函数将killThread定义为False,初始化所有线程并在raw_input()后将killThread转换为True:

killThreads=False

thisThread=threading.Thread(target=oneThread)
otherThread=threading.Thread(target=twoThread)

thisThread.setDaemon(True)
otherThread.setDaemon(True)

thisThread.start()
otherThread.start()

raw_input('Press to end the program')
killThreads=True

一切运行正常直到我使用Curses模块运行一个线程来显示数据。 似乎在Curses线程打开时,它接管所有输入命令。我试图使用getch()但没有成功。我所能做的只是在Curses函数中建立一个计时器:

def displayData():
    screen=curses.initscr()
    screen.nodelay(1)
    timeKill=0
    while (timeKill<80):
        #stuff is drawn#
        time.sleep(0.25)
        timeKill+=1

有谁能告诉我如何查看Curses并让我的键盘输入“到达”主要功能并杀死所有线程?或者我总是要输入Curses,然后让Curses函数改变killThreads变量?如果是这样,我该怎么做(或者我在哪里找到相关文档)?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

很高兴认识你。

我今天试图完成同样的事情。看看这个解决方案:

killThreads=False

thisThread=threading.Thread(target=oneThread)
otherThread=threading.Thread(target=twoThread)

thisThread.setDaemon(True)
otherThread.setDaemon(True)

thisThread.start()
otherThread.start()

raw_input('Press "q" to end the program')

key = ''
while key != ord('q'):
        key = screen.getch()

killThreads=True

curses.nocbreak(); screen.keypad(0); curses.echo()
curses.endwin()

请注意,在将var while切换为q之前,killThreads将非常快速地循环并等待True按钮。

这是很常见的做法。但是,这个while循环在第二个循环中产生了数千个空闲循环,可能会有更优雅的方式或更好地嵌入到while循环time.sleep(0.1)中。