python中的多处理挂起诅咒

python中的多处理挂起诅咒,python,curses,Python,Curses,希望你能帮忙。我试图用python和诅咒编写一个终端应用程序,有一项工作我被迫使用多处理 我面临的问题是,无论我做什么,诅咒都会在我启动多进程p1后立即挂起,我看不到“it works”字符串。然而,如果我从方法foo中删除循环,它就会工作,或者如果我将{print“aaa”}放在foo()方法中,终端就会被垃圾发送字符串 换句话说,诅咒在进程完成之前是不活动的,尽管它应该是活动的。我怎样才能避免呢 import time import math import sys import curses

希望你能帮忙。我试图用python和诅咒编写一个终端应用程序,有一项工作我被迫使用多处理

我面临的问题是,无论我做什么,诅咒都会在我启动多进程
p1
后立即挂起,我看不到“it works”字符串。然而,如果我从方法
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" !!)
启动进程(或线程)时,目标需要是对要运行的函数的引用

当你写这篇文章时:

p1 = Process(target=foo())
您告诉
Process
目标应该是执行
foo
的结果,而不是
foo
本身。 请尝试以下方法:

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

换句话说,你从
中得到了一个无限循环,而
foo
中的True
在那一行上。

你看到的“挂起”可能也是一个丢失的诅咒更新吗?萨皮的回答实际上并没有消除我的“悬念”,我仍然看不到“它有效!!”

以下是我对您的代码进行的迭代,它对我更有效:

# -*- 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()
您将看到,当主程序每半秒刷新一次屏幕时,子进程会增加该值。你可以玩弄这些延迟来了解发生了什么

当然,您也可以在主进程末尾的while循环中添加一行
stdscr.refresh()
。再加上sapi的修复,你的程序也将“不挂起”