相关疑难解决方法(0)

未检测到多处理池中抛出的异常

似乎当从multiprocessing.Pool进程引发异常时,没有堆栈跟踪或任何其他指示它已失败.例:

from multiprocessing import Pool 

def go():
    print(1)
    raise Exception()
    print(2)

p = Pool()
p.apply_async(go)
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)

打印1并静默停止.有趣的是,提高BaseException会起作用.有没有办法让所有异常的行为与BaseException相同?

python exception multiprocessing

64
推荐指数
6
解决办法
4万
查看次数

多处理池在任何线程中存在异常时挂起

我是Python的新手,并尝试使用multiprocessing.pool程序来处理文件,只要没有例外,它就可以正常工作.如果任何线程/进程获得异常,则整个程序等待该线程

代码片段:

cp = ConfigParser.ConfigParser()
cp.read(gdbini)
for table in cp.sections():
    jobs.append(table)
#print jobs
poolreturn = pool.map(worker, jobs)
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)

失败消息:


Traceback (most recent call last):
  File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 525, in __bootstrap_inner
    self.run()
  File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/opt/cnet-python/default-2.6/lib/python2.6/multiprocessing/pool.py", line 259, in _handle_results
    task = get()
TypeError: ('__init__() takes exactly 3 arguments (2 given)', <class 'ConfigParser.NoOptionError'>, ("No option 'inputfilename' in section: 'section-1'",))
Run Code Online (Sandbox Code Playgroud)

我继续添加了一个异常处理程序来终止进程

try:
    ifile=cp.get(table,'inputfilename')
except ConfigParser.NoSectionError,ConfigParser.NoOptionError:
    usage("One of Parameter not found for"+ table)
    terminate()
Run Code Online (Sandbox Code Playgroud)

但它仍然等待,不知道什么是失踪.

python pool exception hang multiprocessing

7
推荐指数
1
解决办法
3134
查看次数

捕获无法处理的异常并重新加注

这是我的问题Hang in Python script using SQLAlchemy and multiprocessing 的后续问题。正如该问题中所讨论的,酸洗异常在 Python 中是有问题的。这通常不是问题,但有一种情况是,Python 多处理模块中发生错误。由于多处理通过酸洗来移动对象,因此如果多处理过程中发生错误,整个过程可能会挂起,如该问题所示。

\n\n

一种可能的方法是修复所有有问题的异常,如该问题中所讨论的。这并不容易,因为人们无法轻易地提前知道可以调用哪些异常。lbolla 在回答问题时建议的另一种方法是捕获异常,构造一个等效的无害异常,然后重新抛出。\n但是,我不确定具体如何执行此操作。考虑以下代码。

\n\n
class BadExc(Exception):\n    def __init__(self, message, a):\n        \'\'\'Non-optional param in the constructor.\'\'\'\n        Exception.__init__(self, message)\n        self.a = a\n\nimport sys\ntry:\n    try:\n        #print foo\n        raise BadExc("bad exception error message", "a")\n    except Exception, e:\n        raise Exception(e.__class__.__name__ + ": " +str(e)), None, sys.exc_info()[2]\nexcept Exception, f:\n    pass\n\nimport cPickle\na = cPickle.dumps(f)\nl = cPickle.loads(a)\nprint "raising error"\nraise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]\n
Run Code Online (Sandbox Code Playgroud)\n\n

此代码对异常进行pickles和unpickles,然后抛出它,给出错误

\n\n
raising error\nTraceback (most recent call last):\n  File "<stdin>", …
Run Code Online (Sandbox Code Playgroud)

python exception multiprocessing

5
推荐指数
1
解决办法
2116
查看次数

标签 统计

exception ×3

multiprocessing ×3

python ×3

hang ×1

pool ×1