我正在尝试运行一个与pool.apply_async
配合得很好的胖函数现在,我正在尝试使用pool.map_async函数(使用functools.partial方法传递2个参数),程序立即完成,没有任何错误或异常......
Sub CreateFormShortcutMenu_OpenReportDir()
Dim cmbRightClick As Office.CommandBar
Dim cmbControl As Office.CommandBarControl
' Create the shortcut menu.
Set cmbRightClick = CommandBars.Add("cmdShortCutMenu_FormOpenReportDir", msoBarPopup, False, True)
With cmbRightClick
' Add the DeleteRecord command.
Set cmbControl = .Controls.Add(msoControlButton, , , , True)
With cmbControl
.BeginGroup = True
.Caption = "Open dir"
.OnAction = "=CallbackOpenDocDir()"
.FaceId = 106
End With
End With
Set cmbControl = Nothing
Set cmbRightClick = Nothing
End Sub
我可能遗失的任何线索?
答案 0 :(得分:1)
首先,如果您要立即map_async
,您可能不需要wait
。如果是这种情况,那么只需使用map
即可。您也可以删除queue
并返回值。但这可能不是你遇到的问题。
问题可能是wait
方法没有引发远程异常。您的process_file
方法可能实际上在池进程中失败,但您没有看到这些异常。与上面提到的 Blckknght 一样,您应该切换到使用get
方法,正如您所看到的here,它将引发远程异常。这是一个简单的示例,其中wait
方法隐藏了远程进程异常,以及如果切换到get
,您可以再次看到它们:
import multiprocessing as mp
def just_dies(n):
raise ValueError("Test")
if __name__ == "__main__":
pool = mp.Pool(4)
results = pool.map_async(just_dies, range(10))
# the wait will immediately silently pass
#results.wait()
# this will actually raise the remote exception
results.get()
如果你运行这个,你会得到一个像这样的追溯错误消息
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "foo.py", line 14, in <module>
results.get()
File "XXX/python3.5/multiprocessing/pool.py", line 608, in get
raise self._value
ValueError: Test
如果您切换到使用wait
方法,那么您将无法看到它。