主循环旁的多进程操作
我最近遇到一个问题,搞了好一阵子。
我正在写一个小脚本,这个脚本有一个主循环。这是一个需要用户关注的过程,用户会在每个步骤中做出回应,然后一些神奇的事情就会发生,这些都是通过一些函数来实现的。
除此之外,我还想启动另一个进程,来监控电脑系统,关注一些特定的事件,比如按下特定的键。如果这些事件发生了,它就会调用和用户输入正确值时一样的函数。
所以我需要创建两个进程:
- 主循环(允许用户互动)
- 背景的“事件扫描器”,它会搜索特定的事件,然后做出反应。
我尝试通过启动一个主循环和一个守护进程来实现这个目标。问题是,当我启动后台进程时,它确实启动了,但之后主循环却没有启动。
我把所有内容简化了一下,以便更清楚:
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
,而这个调用是不会返回的。