在Python中使用多处理池

时间:2019-04-05 12:57:54

标签: python multiprocessing

有人可以指出此代码段出了什么问题。它没有给出任何结果。

    import multiprocessing

results = []
def log_results(result):
    results.append(result)


def multiply(x, y):
    print(f"Gets here for process name {multiprocessing.current_process().name()}")
    return x * y

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    numbers = [(1,1), (2,2), (3,3)]
    for x, y in numbers:
        print (f"Checking x {x} and y {y}")
        pool.apply_async(multiply, (x, y), callback=log_results)
    pool.close()
    pool.join()
    print(results)

results是一个空列表,在这种情况下不应该对吗?我已经使用了apply_async和map_async。两者都没有给出正确的输出。有人可以在这里帮我吗

2 个答案:

答案 0 :(得分:3)

编辑:您已对代码进行了编辑,因此下面的答案已经过期。我认为需要做的仅有两件事是:

  1. 添加一个import UsersList from './user/UsersList'; //then i defined class App extends Component { render () { return ( <BrowserRouter> <div> <Header /> <Switch> <Route exact path='/userlist' component={UsersList} /> </Switch> </div> </BrowserRouter> ) } } ,因为我仍然认为您需要确保默认情况下写入的池不会无提示地失败。
  2. error_callback重写为multiprocessing.current_process().name()

所以:

multiprocessing.current_process().name

旧答案

这让我发疯了片刻,但是后来才有意义。

如果我将import multiprocessing results = [] def log_results(result): results.append(result) def log_e(e): print(e) def multiply(x, y): print(f"Gets here for process name {multiprocessing.current_process().name}") return x * y pool = multiprocessing.Pool() numbers = [(1,1), (2,2), (3,3)] for x, y in numbers: print (f"Checking x {x} and y {y}") pool.apply_async(multiply, (x, y), callback=log_results, error_callback=log_e) pool.close() pool.join() print(results) 更改为这样,则运行它:

multiply

运行正常。您在评论中说:“我不认为函数def multiply(nums): print("print") return nums[0] * nums[1] 首先要被调用。”这是因为指定了multiply,但没有指定callback。省略错误回调的结果是您的脚本无提示地失败。

您可以使用以下方法进行检查:

error_callback

哪个给:

import multiprocessing

results = []
def log_results(result):
    print(result)

def log_e(e):
  print(e)

def multiply(x, y):
    print(f"Gets here for process name {multiprocessing.current_process().name()}")
    return x * y

pool = multiprocessing.Pool()
numbers = [[1,1], [2,2], [3,3]]
mapResult = pool.map_async(multiply, numbers, callback=log_results,
                           error_callback=log_e)

pool.close()
pool.join()

使用multiply() missing 1 required positional argument: 'y' 就像这样:

multiply

然后返回def multiply(nums): return nums[0] * nums[1]

PS 我正在运行Python 3.6.7

答案 1 :(得分:2)

因此,由于以下这一行,您当前的代码实际上失败了:

 print(f"Gets here for process name {multiprocessing.current_process().name()}")

它错误地显示为TypeError: 'str' object is not callable,不是因为您呼叫multiply()的方式有什么

如果将其删除:

import multiprocessing

results = []
def log_results(result):
    results.append(result)


def multiply(x, y):
#    print(f"Gets here for process name {multiprocessing.current_process().name()}")
    return x * y

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    numbers = [(1,1), (2,2), (3,3)]
    for x, y in numbers:
        print (f"Checking x {x} and y {y}")
        pool.apply_async(multiply, (x, y), callback=log_results)
    pool.close()
    pool.join()
    print(results)

它返回:

Checking x 1 and y 1
Checking x 2 and y 2
Checking x 3 and y 3
[1, 4, 9]

因此,如果您实际上隔离了print(f)

print(multiprocessing.current_process().name())

您收到错误:TypeError: 'str' object is not callable是因为

multiprocessing.current_process()

实际上是一个以name作为对象属性的过程对象,该对象返回字符串(感谢darkonaut)字符串。您正在尝试将.name()作为函数来调用,但这是一个属性。

因此,如果您将函数更改为包括.name而不是.name()

import multiprocessing

results = []
def log_results(result):
    results.append(result)


def multiply(x, y):
    print(f"Gets here for process name {multiprocessing.current_process().name}")
    return x * y

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    numbers = [(1,1), (2,2), (3,3)]
    for x, y in numbers:
        print (f"Checking x {x} and y {y}")
        pool.apply_async(multiply, (x, y), callback=log_results)
    pool.close()
    pool.join()
    print(results)

您返回:

Checking x 1 and y 1
Checking x 2 and y 2
Checking x 3 and y 3
Gets here for process name ForkPoolWorker-1
Gets here for process name ForkPoolWorker-2
Gets here for process name ForkPoolWorker-3
[1, 4, 9]

您想要的是什么。