使用python多進程和curses,似乎終止一個進程干擾curses顯示。
例如,在下面的代碼中,爲什麼終止進程會阻止curses顯示文本? (按a後按b)
更確切地說,不僅顯示字符串「hello」,而且顯示整個curses窗口。終止一個進程打破python詛咒
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。
編輯:
我仍然能夠與這種更精簡的版本重現不調用sleep()。現在只需按「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)
根據文檔,當進程使用鎖或信號量時,使用terminate()會導致問題:警告如果在關聯進程使用管道或隊列時使用此方法,則管道或隊列負責被破壞,並可能被其他程序無法使用。同樣,如果進程已經獲得了鎖或信號量等,那麼終止它可能會導致其他進程死鎖。「我不確定'睡眠'是如何實現的,但這可能是原因。 https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.terminate – amuttsch
@amuttsch好主意,但那不是,請參閱我的編輯。 – Zil0