使用python中的多处理模块时,“ starmap”方法未始终返回值

时间:2019-07-05 19:07:46

标签: python multiprocessing

下面,由于我的实际方法太长,我对程序应该执行的操作有一些伪代码。我正在尝试使用多处理模块来加快“ func1”的完成时间。这两种方法都是我使用PyQt5构建的GUI的一部分。在大多数情况下,使用GUI“ func2”输入参数时,永远不会返回输出并保持运行。最奇怪的部分是,即使我根本没有修改代码,偶尔输入相同的确切参数,“ func2”实际上仍然有效。

有关该问题的更多信息

-我在Spyder工作

-参数numpy_array具有30,000行和3列。我需要我的方法能够处理非常大的数组。其他参数是非常小的列表。

-我希望所有进程都可以访问同一阵列。而且该数组是只读的。

当我使用GUI运行程序时,我打开了任务管理器,并且注意到了有关“ func2”何时工作以及何时不工作的模式。

当我运行程序时,“ func2”不会终止,任务管理器中不断发生以下行为。创建的两个进程将一直运行,直到它们都消耗了大约27-30%的CPU和大约75-80 MB的内存,然后突然这两个进程的CPU%下降到0%,并且所使用的内存下降到大约20- 40 MB。这将无限期地重复,并且“ func2”不返回任何内容。

当“ func2”起作用时,在任务管理器中发生以下行为。这两个进程都将运行,直到它们消耗27-30%的CPU和75-80 MB的内存。然后,这两个进程的CPU百分比均保持稳定,但它们会继续消耗更多的内存,直到它们完成约140-150 MB。此时,“ func2”返回一个列表。

我的主要问题如下:

为什么在大多数情况下,多处理无法正常工作,但是即使我每次都使用相同的参数运行相同的代码,该处理偶尔还是可以工作?

有没有办法使“ func2”持续工作?

def func1(numpy_array, num1, num2, num3):
    #Reads from array and does computation 
    #It returns a number at the end
    returns number

def func2(numpy_array, num1_lst, num2_lst, lst):
    result = []
    for num3 in lst:
        arguments = list(itertools.product(*[[numpy_array], num1_lst, num2_lst, [num3]]))
        with multiprocessing.Pool(processes = 2) as p:
            output = p.starmap(func1, arguments)
        result.append(output)
    return result

当“ func2”没有运行时,我从没有收到任何错误消息,但是我能够看到2个进程在任务管理器中继续运行。我要发生的事情是进行多处理,以便在循环的每次迭代中提供输出,并将该输出附加到列表中。然后我要它返回该列表。

0 个答案:

没有答案