2015-01-05 13 views
1

당신을 도울 수 있기를 바랍니다. 나는 파이썬과 저주를 사용하는 터미널 애플리케이션을 작성하려고 노력하고 있으며, 한 가지 작업을 위해 나는 다중 처리를 사용해야한다.다중 처리로 인해 파이썬에서 저주가 걸린다

내가 직면 한 문제는 다중 처리를 시작한 직후에 저주가 멈추고 p1 "작동합니다"문자열이 표시되지 않는다는 것입니다. 그러나 메서드 foo에서 루프를 제거하면 작동합니다. 또는 을 foo() 메서드에 넣으면 터미널에 문자열이 스팸됩니다.

즉, curses는 반대가되어야하지만 프로세스가 완료 될 때까지 비활성 상태입니다. 어떻게 피할 수 있습니까?

import time 
import math 
import sys 
import curses 
from multiprocessing import Process, Value, Array 

sen1= Value('f',0) 

def foo(): 
    while(True): 
     sen.value = 1 

stdscr = curses.initscr() 
curses.noecho() 
stdscr.border(0) 
stdscr.addstr(12, 25, "Python curses in action!") 
stdscr.refresh() 
p1 = Process(target=foo()) 
p1.start() 
while true: 
    stdscr.addstr(1,1,"it works" !!) 

답변

3

당신이 프로세스 (또는 스레드)를 시작, 대상은 실행하려는 기능에 참조 할 필요가있다.

p1 = Process(target=foo()) 

당신은 Process을 이야기하고있는 대상이 foo하지 foo 자체를 실행하는 결과해야한다는 :

당신이 쓸 때. 대신을 시도해보십시오 즉

p1 = Process(target=foo) # do not call foo 

, 당신은 그 줄에 foowhile True에서 무한 루프가 있어요.

0

"hang"으로 본 내용이 누락 된 curses 업데이트 일 수 있습니까? SAPI의 대답은 실제로 내가 아직 보지 못하는 나를 위해 "정지"를 제거하지 않습니다 "작동!"...

다음은 나를 위해 잘 작동 코드 내 반복이다 :

# -*- coding: utf-8 -*- 

import time 
import curses 
from multiprocessing import Process, Value 

shared_mem = Value('i', 1) 

def incrementor(): 
    while shared_mem.value > 0: 
     shared_mem.value += 1 
     time.sleep(0.001) 

screen = curses.initscr() 

curses.noecho() 
curses.curs_set(0) 
screen.keypad(1) 

screen.border(0) 
screen.addstr(12, 20, "Parent: {}!".format(shared_mem.value)) 

p1 = Process(target=incrementor) 
p1.start() 

while True: 
    # delay in tenths of seconds 
    curses.halfdelay(5) 

    screen.addstr(12, 28, "{}!".format(shared_mem.value)) 

    event = screen.getch() 
    if event == ord("q"): 
     shared_mem.value = 0 
     break 

curses.endwin() 

주 프로그램이 0.5 초마다 화면을 새로 고치는 동안 하위 프로세스가 값을 증가시키는 것을 볼 수 있습니다. 지연과 함께 놀아서 무슨 일이 일어나고 있는지 느낄 수 있습니다.

물론, 메인 프로세스가 끝날 때 while 루프에 stdscr.refresh()이라는 줄을 추가 할 수 있습니다. sapi의 수정과 함께 프로그램이 "멈추지"않을 것입니다.

관련 문제