多进程异常捕获

最近在调试程序时总会莫名奇妙的发生一些异常,就现象来说就是多进程程序莫名奇妙的退出,并且不报出错的堆栈信息。。。

改为单进程跟踪后,发现下面语句中写错了个\d:

def launch(s, e, i)
# ...
print 'Process -%d\tnum: %d\tsuccess: %d\tdiscard: %d\tnull_num: \d\terr: %d\ttime_clock: %s' % \
      (pid, num, cnt, discard, null_num, err, str(time.clock()))
# ...
if __name__ == "__main__":
    for i in range(2):
        _start = 1
        _end = 100
        pool.apply_async(launch, (_start, _end, i))
    pool.close()
    pool.join()

单进程调试时:

def launch()
# ...
print 'Process -%d\tnum: %d\tsuccess: %d\tdiscard: %d\tnull_num: \d\terr: %d\ttime_clock: %s' % \
      (1, 2, 3, 4, 5, 6, str(time.clock()))
# ...
if __name__ == "__main__":
    for i in range(2):
        _start = 1
        _end = 100
        pool.apply_async(launch)
    pool.close()
    pool.join()

报错如下:

 Traceback (most recent call last):
  File "E:/repository/datafuse/snowball/src/abs_person_import_133_debug.py", line 920, in <module>
    launch(1,100,0)
  File "E:/repository/datafuse/snowball/src/abs_person_import_133_debug.py", line 907, in launch
    (pid, num, cnt, discard, null_num, err, str(time.clock()))
TypeError: not all arguments converted during string formatting

经分析发现,由于采用多进程执行方式,在启动子进程后,进程异常输出不会在当前终端(ssh 连接)显示,猜测可能是子进程不占用终端输出,因而不会打印异常堆栈。

然而,当程序修改如下后,依然不报错了。。。。。。(╯‵□′)╯︵┻━┻

def launch(a, b, c)
# ...
print 'Process -%d\tnum: %d\tsuccess: %d\tdiscard: %d\tnull_num: \d\terr: %d\ttime_clock: %s' % \
      (a, b, c, 4, 5, 6, str(time.clock()))
# ...

if __name__ == "__main__":

    for i in range(2):
        _start = 1
        _end = 100
        pool.apply_async(launch, (1, 100, 0))

    pool.close()
    pool.join()

  考虑可能是由于使用了参数,导致pool中处理流程发生了改变。

断网了。。。(未完待续)

转载于:https://my.oschina.net/u/2269890/blog/488731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值