2015-01-05 3 views
1

надеюсь, что вы сможете помочь. Я пытаюсь написать приложение терминала с использованием python и curses, и для одной работы я вынужден использовать многопроцессорность.многопроцессорность висит проклятия в python

Проблема, с которой я столкнулся, заключается в том, что независимо от того, что я делаю, проклятия зависают сразу после запуска многопроцесса p1, и я не вижу строку «это работает». Если, однако, я удаляю цикл из метода foo, он работает, или если я положил {print "aaa"} в метод foo(), терминал был послан спамом со строками.

Другими словами, проклятия неактивны, пока процесс не завершится, хотя он должен быть противоположным. Как я могу избежать этого?

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 

Другими словами, вы получаете бесконечный цикл из while True в foo на этой линии.

0

Может ли быть то, что вы видели как «повесить», также может быть недостающим обновлением проклятий? Ответ 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() 

Вы увидите, что подпроцесс увеличивает значение, когда основная программа просто обновляет экран каждые полсекунды. Вы можете поиграть с задержками, чтобы почувствовать, что происходит.

Конечно, вы можете просто добавить строку с stdscr.refresh() в цикл while в конце основного процесса. Это, вместе с исправлением sapi, сделает вашу программу «не зависающей», тоже.

Смежные вопросы