作者os653 (allstar)
看板Python
标题[问题] 请问如何在Pipe中处理KeyboardInterrupt
时间Sun Feb 19 07:10:45 2012
程式码如下
# -*- coding: utf-8 -*-
from multiprocessing import Pipe, Process
def run(rpipe):
try:
data = rpipe.recv()
exec(data)
except:
print 'except' # 为什麽抓不到?
finally:
print 'finally'
if __name__=='__main__':
rpipe, wpipe = Pipe(False)
p = Process(target=run, args=(rpipe, ))
p.start()
try:
data = raw_input()
wpipe.send(data)
except KeyboardInterrupt:
wpipe.close()
p.join()
这程式是把使用者输入的资料直接丢给 child process 执行
问题是,如果使用者按下 Ctrl-C,child process 那边不知道要怎麽写才能正确处理
本来的想法是,recv 中不能被中断,所以 KeyboardInterrupt 会被搁置
然後 parent process 关闭 pipe 导致 recv 产生 EOFError
所以应该先处理 EOFError 再处理 KeyboardInterrupt。但实际执行结果如下
finally
Process Process-1:
Traceback (most recent call last):
File "C:\Python26\lib\multiprocessing\process.py", line 232, in _bootstrap
self.run()
File "C:\Python26\lib\multiprocessing\process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "C:\program_\test\m.py", line 5, in run
data = rpipe.recv()
KeyboardInterrupt
根本没有任何 exception 被抓到就直接跳到 finally
然後不知道从哪边丢出不知名错误和 KeyboardInterrupt
请问这到底是怎麽执行的?要怎麽写才能正确动作?完全搞不懂...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.41.140.104
1F:推 kdjf:exeception是raw_input丢出来的... , 然後被except KbI接到 02/19 08:55
2F:→ os653:KeyboardInterrupt在parent process跟child process都会产生 02/19 09:03
3F:→ os653:raw_input()那个是parent process的,有抓到没错阿 02/19 09:04
4F:→ os653:现在问题是child process那边的动作很奇怪,不知道怎办 02/19 09:06
5F:→ kdjf:这我没用过multiprocess这个module, 不太想去trace它... 02/19 09:31
6F:→ kdjf:看起来像是你的process,还没开始跑就被keyboard interrupt了 02/19 10:09