最近在调试程序时总会莫名奇妙的发生一些异常,就现象来讲就是多进程程序莫名奇妙的退出,而且不报出错的堆栈信息。。。python
改成单进程跟踪后,发现下面语句中写错了个\d:app
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()
单进程调试时:ssh
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()
报错以下:async
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 链接)显示,猜想多是子进程不占用终端输出,于是不会打印异常堆栈。debug
然而,当程序修改以下后,依然不报错了。。。。。。(╯‵□′)╯︵┻━┻调试
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中处理流程发生了改变。code
断网了。。。(未完待续)orm