3

我正在为一个问题苦苦挣扎一段时间。我正在构建一个使用主循环的小脚本。这是一个需要用户注意的过程。用户对步骤做出响应,然后使用某些功能会发生一些魔术

除此之外,我想生成另一个进程来监视计算机系统中的某些特定事件,例如按下特定键。如果这些事件发生,那么它将启动与用户提供正确值时相同的功能。

所以我需要做两个过程: - 主循环(允许用户交互) - 后台“事件扫描器”,它搜索特定事件然后对其做出反应。

我通过启动一个主循环和一个守护进程多处理进程来尝试这个。问题是当我启动后台进程时它会启动,但之后我没有启动主循环。我简化了一切以使其更清晰:

import multiprocessing, sys, time

def main_loop():
    while 1:
        input = input('What kind of food do you like?')
        print(input)

def test():
    while 1:
        time.sleep(1)
        print('this should run in the background')

if __name__ == '__main__':
    try:
        print('hello!')
        mProcess = multiprocessing.Process(target=test())
        mProcess.daemon = True
        mProcess.start()
        #after starting main loop does not start while it prints out the test loop fine.
        main_loop() 
    except:
        sys.exit(0)
4

2 回答 2

6

你应该做

mProcess = multiprocessing.Process(target=test)

代替

mProcess = multiprocessing.Process(target=test())

您的代码实际上test在父进程中调用,并且该调用永远不会返回。

于 2013-03-15T10:58:51.100 回答
-2

您可以使用锁定同步来更好地控制程序的流程。奇怪的是,输入函数会引发 EOF 错误,但我相信您可以找到解决方法。

import multiprocessing, sys, time

def main_loop(l):
    time.sleep(4)
    l.acquire()

    # raise an EOFError, I don't know why .
    #_input = input('What kind of food do you like?') 

    print(" raw input at 4 sec ")
    l.release()

    return

def test(l):
    i=0
    while i<8:
        time.sleep(1)

        l.acquire()
        print('this should run in the background : ', i+1,  'sec')
        l.release()

        i+=1

    return



if __name__ == '__main__':

    lock = multiprocessing.Lock()


    #try:
    print('hello!')
    mProcess = multiprocessing.Process(target=test, args = (lock, ) ).start()

    inputProcess = multiprocessing.Process(target=main_loop, args = (lock,)).start()



    #except:
        #sys.exit(0)
于 2013-03-15T11:00:17.357 回答