pythonの多重処理とcursesを使用すると、Processを終了するとcursesの表示が妨げられます。
たとえば、次のコードでは、プロセスの終了によってcursesのテキスト表示が停止するのはなぜですか? (aを押した後にbを押すと)
もっと正確に言えば、文字列 "hello"だけでなく、cursesウィンドウ全体が表示されるようです。プロセスを終了すると、pythonのcursesが中断されます
import curses
from multiprocessing import Process
from time import sleep
def display(stdscr):
stdscr.clear()
curses.newwin(0,0)
stdscr.timeout(500)
p = None
while True:
stdscr.addstr(1, 1, "hello")
stdscr.refresh()
key = stdscr.getch()
if key == ord('a') and not p:
p = Process(target = hang)
p.start()
elif key == ord('b') and p:
p.terminate()
def hang():
sleep(100)
if __name__ == '__main__':
curses.wrapper(display)
私はGNU/Linuxでpython 3.6を実行しています。
編集:
私はまだ()睡眠を呼び出すことはありません。このよりストリップダウンバージョンで再現することができますよ。今すぐ "a"を押すと、バグが発生します。
import curses
from multiprocessing import Process
def display(stdscr):
stdscr.clear()
curses.newwin(0,0)
stdscr.timeout(500)
p = None
while True:
stdscr.addstr(1, 1, "hello")
stdscr.refresh()
key = stdscr.getch()
if key == ord('a') and not p:
p = Process(target = hang)
p.start()
p.terminate()
def hang():
while True:
temp = 1 + 1
if __name__ == '__main__':
curses.wrapper(display)
、ドキュメントによれば、 '(終了用いて)プロセスがロック又はセマフォーを使用する場合'問題を引き起こす可能性があります: '関連するプロセスは、パイプまたはキューを使用している場合、この方法が使用されている場合、警告が、パイプまたはキューがやすいです他のプロセスによって使用不能になる可能性があります。同様に、プロセスがロックやセマフォーなどを取得した場合、プロセスを終了すると、他のプロセスがデッドロックする可能性があります。「スリープの仕組みがわからないが、それが原因かもしれない。 https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.terminate – amuttsch
@amuttsch素敵なアイデアですが、それは私の編集をご覧ください。 – Zil0