主循环旁的多进程操作

3 投票
2 回答
2900 浏览
提问于 2025-04-17 19:11

我最近遇到一个问题,搞了好一阵子。
我正在写一个小脚本,这个脚本有一个主循环。这是一个需要用户关注的过程,用户会在每个步骤中做出回应,然后一些神奇的事情就会发生,这些都是通过一些函数来实现的。

除此之外,我还想启动另一个进程,来监控电脑系统,关注一些特定的事件,比如按下特定的键。如果这些事件发生了,它就会调用和用户输入正确值时一样的函数。

所以我需要创建两个进程:
- 主循环(允许用户互动)
- 背景的“事件扫描器”,它会搜索特定的事件,然后做出反应。

我尝试通过启动一个主循环和一个守护进程来实现这个目标。问题是,当我启动后台进程时,它确实启动了,但之后主循环却没有启动。
我把所有内容简化了一下,以便更清楚:

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)

2 个回答

-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)
6

你应该这样做:

mProcess = multiprocessing.Process(target=test)

而不是:

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

因为你的代码实际上是在父进程中调用了 test,而这个调用是不会返回的。

撰写回答