gpt4 book ai didi

python - 使用 ncurses+python 防止竞争条件

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:44 24 4
gpt4 key购买 nike

我遇到了与这篇文章中类似的问题

C, junk appearing on screen using curses

但是,我正在使用 python。我编写了一个包装器 Screen 类,它以更方便的方式包装了curses 模块。我有一个像这样的问题

def getKeyCode(self):                                                                                                                         
with self._curses_lock:
self._curses_screen.nodelay(False)

c = self._curses_screen.getch()
if c == 27:
with self._curses_lock:
self._curses_screen.nodelay(True)
next_c = self._curses_screen.getch()

with self._curses_lock:
self._curses_screen.nodelay(False)

return c

以及归结为这一点的写作

        with self._curses_lock:                                                                                                               
self._curses_screen.addstr(y, x, out_string, attr)

getKeyCode 由一个单独的 python 线程调用,该线程大部分时间在 getch 中等待,当按下某个键时,它会被添加到队列中。在另一个(主)线程上,我有一个事件循环,它从队列中获取事件,执行重绘并刷新屏幕。

据我所知,ncurses 保持共享状态,我添加了一堆 threading.Locks 以防止竞争条件,但如果我一直按下箭头键,偶尔会得到垃圾。我猜想这是因为 getch 在 ncurses 内部被释放,而另一个线程正在重新绘制。这会扰乱重绘的状态,产生奇怪的结果。显然我不能让我的 getKeyCode 线程保持锁定,因为这意味着在 getch 返回之前完全阻止重新绘制,我也不想让 getch 非阻塞,因为我会 1) 不会真正解决问题并且2) 有一个线程不断运行,这会将 CPU 使用率提高到 100%。我该如何解决这个问题?

最佳答案

我解决了这个问题,就像这样。我将 getch 设置为非阻塞

self._curses_screen.nodelay(True) 

然后我不是在curses中等待,而是在stdin上进行选择。当 select 返回时,一些内容可用,我可以锁定并获得对 ncurses 后端的独占访问权限,保证我将立即返回可用内容并释放锁定。

def getKeyCode(self):                                                                                                                         
select.select([sys.stdin], [], [])

with self._curses_lock:

c = self._curses_screen.getch()
if c == 27:
next_c = self._curses_screen.getch()

return c

关于python - 使用 ncurses+python 防止竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com