Python 多处理程序只运行单个进程

Python 多处理程序只运行单个进程,python,Python,我有java背景,但我在python中对多处理做了相当多的研究,但仍然遇到了一些问题。我有一门课: class Test: @staticmethod def run(arg1, arg2, arg3, arg4): # do stuff that takes a bit argsarg\u数组的二维数组 最后我打电话给: pool = mp.Pool(24) for i in range(len(args_array)): pool.apply_as

我有java背景,但我在python中对多处理做了相当多的研究,但仍然遇到了一些问题。我有一门课:

class Test:
    @staticmethod
    def run(arg1, arg2, arg3, arg4):
        # do stuff that takes a bit
args
arg\u数组的二维数组

最后我打电话给:

pool = mp.Pool(24)
for i in range(len(args_array)):
     pool.apply_async(Test.run(args_array[i][0], args_array[i][1], args_array[i][2], args_array[i][3]))
这只是该程序的简化版本。然而,该程序仍然只使用一个内核(占我CPU的6%)

我还尝试:

pool.apply_async(Test.run, args=(args_array[i][0], args_array[i][1], args_array[i][2], args_array[i][3]))
编辑: 根据要求,我制作了另一个(更简单的)工作程序,解决了同样的问题:

class Searcher:
    @staticmethod
    def linear_search(array_to_search, target_value):
        print("beginning search")
        for i in range(len(array_to_search)):
            time.sleep(1)  # delay to make things interesting
            if array_to_search[i] == target_value:
                print("Value was found!")
                return True
        print("Value was not found")
        return False


def generate_random_array(size, value_range):
    array = []
    for i in range(size):
        array.append(r.randint(1, value_range))
    return array


if __name__ == '__main__':
    some_arbitrary_number = 50
    random_arrays = []
    for i in range(some_arbitrary_number):
        random_arrays.append(generate_random_array(10, 5))  # array of 10 numbers ranging 1-5

    pool = mp.Pool(processes=24)
    for i in range(len(random_arrays)):
        result = pool.apply_async(Searcher.linear_search, args=(random_arrays[i], 3))  # search for 3 in this array
        result.get(10)
这个程序只是生成一组随机生成的数组,并检查它们是否包含值3。然而,我希望所有这些搜索并行进行,因此我的输出看起来像

beginning search
beginning search
beginning search
...
beginning search
Value was found!
Value was not found!
...
然而,我得到:

beginning search
Value was found!
beginning search
Value was found!
beginning search

该程序只使用一个内核,我希望它使用24。

在您调用的代码中。
之后立即获取
。应用异步
。基本上,您告诉Python的是在池中启动一个任务,然后等待该任务完成,然后再启动下一个任务——因此,您一次只运行一个任务

使用
apply\u async
的正确方法是收集它返回的所有promise对象,然后
。在单独的循环中获取它们:

promises=[pool.apply\u async(Searcher.linear\u search,args=(arr,3)用于随机数组中的arr]
对于承诺中的p:
p、 得到()
或者,更简单的方法是使用
Pool.starmap

用于pool.starmap中的结果(Searcher.linear_search,((arr,3)用于随机_数组中的arr)):
打印(结果)

与创建流程的开销相比,您的工作负载非常小。您永远无法获得有用的指标。更重要的是,您正在同步执行调用中的所有内容。您必须为
apply\u async
提供一个可调用的调用,而不是一个完整的调用。请提供
args\u array
(因为您声称收到的错误消息与您的描述不匹配)并将示例代码放在一起,以便以可复制的方式产生错误。@DontJudgeMe我肯定,但我怀疑数组的大小是否导致了您的问题或与解决方案有关,因此如果您提供的示例具有相同的问题,但数据不多,人们将能够指出您的确切问题,而不是ha“是的,不是,不是”在注释中键入对话为什么要调用结果。在apply\u async之后立即获取?这将阻止调用过程,直到作业完成。您应该将apply\u async的承诺收集到一个数组中,然后在一个单独的循环中获取它们。这样,所有应用都将并行进行。我希望这会强调发布承诺的重要性正确的MCVE-您假设错误在
apply\u async
行上,并在其他地方出现问题时单独发布。使用上下文管理器处理池可能是个好主意。