有人可以指出此代码段出了什么问题。它没有给出任何结果。
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。两者都没有给出正确的输出。有人可以在这里帮我吗
答案 0 :(得分:3)
编辑:您已对代码进行了编辑,因此下面的答案已经过期。我认为需要做的仅有两件事是:
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>
)
}
}
,因为我仍然认为您需要确保默认情况下写入的池不会无提示地失败。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]
您想要的是什么。