【发布时间】:2014-08-10 07:12:12
【问题描述】:
在处理由 pool.map 调用的函数中的数据时,我遇到了非常奇怪的问题。例如,以下代码按预期工作...
import csv
import multiprocessing
import itertools
from collections import deque
cur_best = 0
d_sol = deque(maxlen=9)
d_names = deque(maxlen=9)
**import CSV Data1**
def calculate(vals):
#global cur_best
sol = sum(int(x[2]) for x in vals)
names = [x[0] for x in vals]
print(", ".join(names) + " = " + str(sol))
def process():
pool = multiprocessing.Pool(processes=4)
prod = itertools.product(([x[2], x[4], x[10]] for x in Data1))
result = pool.map_async(calculate, prod)
pool.close()
pool.join()
return result
process()
现在,当我向 calculate() 添加一个简单的 if 语句时,我没有得到任何输出。
def calculate(vals):
#global cur_best
sol = sum(int(x[2]) for x in vals)
if sol > cur_best:
cur_best = sol
names = [x[0] for x in vals]
print(", ".join(names) + " = " + str(cur_best))
#would like to append cur_best and names to a deque
我已尝试调整声明“cur_best”的位置,但无济于事。
在进行计算时,我正在尝试跟踪“当前最佳”解决方案。在我的线性代码中,此逻辑位于嵌套的 for 循环中,我将每个新的 'cur_best' 附加到一个双端队列。
我的新问题是否与 pool.map 或 pool.map_async 的工作方式有关?我可以不再将我的 calculate() 函数视为一个线性循环吗?
我需要解决其他几个条件语句。我应该在代码的不同部分处理这个吗?如果是这样,具体是怎样的?
【问题讨论】:
-
global在您的实际代码中被注释掉了吗? -
使用
multiprocessing将创建多个进程(这里是 4 个),每个进程都有自己的全局cur_best值,因此您的代码结构将不起作用。 -
@JasonS 是的,全局被注释掉了
-
@ArminRigo 那么为什么每个进程不打印自己的结果呢?我不明白为什么我的输出为零
标签: python map multiprocessing pool itertools