【发布时间】:2014-08-08 10:50:35
【问题描述】:
按照 Python 标准库中的多处理示例,我正在尝试使用多处理进行一些计算,但返回一个索引错误。
现在的结构是这样的,
main.py有应用类和一些加载数据的函数
run.py是
if __name__=='__main__':
import main
main.show()
它调用main中的show()函数来显示gui。我使用其他 SO 帖子中的这种方法来阻止显示多个 GUI。
在 GUI 类之外我有这些功能
def start_process():
print 'Starting', multiprocessing.current_process().name
def multimanager(start,end):
inputs=range(start,end)
non_multi = map(mymod.algorithm, inputs)
print non_multi
pool_size = multiprocessing.cpu_count() * 2
pool = multiprocessing.Pool(processes=pool_size,
initializer=start_process,
)
pool_outputs = pool.map(mymod.algorithm,inputs)
pool.close()
pool.join()
print "Pool :", pool_outputs
我注意到了一些事情。根据这本书,map() 函数应该具有相同的作用。因此,books 示例对输入进行了与处理相同的映射。我已经做到了,non_multi = map(mymod.algorithm, inputs) 有效。但是,多处理没有。
如果我将 mymod.algorithm 更改为仅 +1 输入数字,它似乎可以工作。除了,似乎从来没有调用过start_process() 函数,因为它没有print 'Starting'
虽然 Pool 确实打印了基本加法算法的结果,但我不确定它是否真的在不同的进程上,因为似乎没有调用 start_process() 函数。
如果是这样,我想知道算法是否做了多处理不允许的事情。在另一篇 SO 帖子中,一个答案提到多处理中的这个列表索引错误并不具体。如果更多信息可以帮助找到问题,算法会通过导入存储字典数组的globalvariable.py 文件来调用全局变量。 map 函数的输入是数组的索引,在不同的函数中,数据是通过矩阵运算等计算出来的,然后将一些数据存储到全局变量中。
这可能是我使用的全局变量的问题吗?如果是这样,是否有不同的方法来为每个进程传递变量? (程序有点大,所以不能只将变量复制到mymod.py文件中。
错误是
File "C...main.py", line 71, in multimanager
pool_outputs = pool.map(mymod.algorithm,inputs)
File "C:\Python27\lib\multiprocessing\pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "C:\Python27\lib\multiprocessing\pool.py", line 554, in get
raise self._value
IndexError: list index out of range
编辑附加信息:
模块中有一个类myclass.py
class Data():
def __init__(self):
self.Mydata = None
globalvariable.py 文件有一个存储数据类的全局变量数组
data = []
main.py 和 mymod.py 都导入 globalvariable.py。在main.py数据被加载,并且每次都会创建一个类实例(myclass.Data()),然后这个实例被追加到数组data存储在globalvariable.py中。所以在调用进程之前,打印全局变量数据会打印
[<myclass.Data instance at 0x050F6878>,<myclass.Data instance at 0x050F6879>]
但是,当进程启动时,它会打印为一个空数组。
mymod.py 看起来像:
import globalvariable as gv
def algorithm(index):
print gv.data
打印[]
我也仅使用基本变量进行了尝试,但没有成功。让进程在启动时加载正确变量的方法是什么?注意,我不想在进程之间共享,只是让每个进程从头开始使用相同的数据。
【问题讨论】:
-
您是否在 IDLE 中运行此代码?这可能可以解释为什么您没有看到您在
start_process中输入的print语句的输出。直接从 Windows CLI 运行它,您可能会看到输出。 -
@dano 是的,我正在使用空闲,感谢您的提示!
标签: python python-2.7 runtime-error multiprocessing pool