python pool.map_async不等待.wait()

时间:2018-05-28 20:06:48

标签: python python-3.x python-multiprocessing

我正在尝试运行一个与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

我可能遗失的任何线索?

1 个答案:

答案 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方法,那么您将无法看到它。