我正在尝试使用python的一些多处理来提高某些功能的速度,我知道创建一个进程有一个很大的成本,但我的功能是花费3秒来顺序执行所以我在想一些多处理可以解决问题。
我错了(大呐喊)多处理似乎更慢或至少不快。 在这里加上一些上下文,我在多处理之前得到了什么:
for i in range(0, 3):
for j in range(0, 3):
result = my_function(my_args)
现在我对多处理有什么了:
pool = Pool()
for i in range(0, 3):
for j in range(0, 3):
result = pool.apply_async(my_function,my_args).get()
pool.close()
pool.join()
我用my_function thingy替换了真正的函数,因为我的函数基本上是一个痛苦的阅读。
使用多处理的工作量是小的,还是我做错了?
编辑:
正如有些人说它是顺序工作的,因为我每次都使用get,我需要在连接结束后使用它,但现在我有一个随机弹出的异常,这里是追溯的结束:
文件“/home/rtodo/anaconda3/lib/python3.5/multiprocessing/pool.py”,第608行,在获取 提高self._value IndexError:pop index超出范围
这是我的代码更正
pool = Pool()
for i in range(0, 3):
for j in range(0, 3):
neigbhourhood[i][j] = pool.apply_async(my_function,my_args)
for k in range(0, 3):
for l in range(0, 3):
neigbhourhood[i][j] = neigbhourhood[i][j].get()
pool.close()
neigbhourhood是一个3x3阵列。
编辑编辑: 我改变了一些代码,现在游戏池在get之后关闭,我不使用join。
答案 0 :(得分:4)
这两个例子没有(真正的)差异,因为b
将等待该过程完成。因此,您的多进程示例也将是顺序的,但它会在不同节点上生成进程时花费更多时间。
首先启动所有进程,然后等待结果。
.get()
您也可以省略pool = Pool()
futures = []
for i in range(0, 3):
for j in range(0, 3):
futures.append(pool.apply_async(my_function,my_args))
# You can also make some additional calculation here if you want
#
# Lets see if the multiprocess stuff is finished
for i in futures:
i.get()
pool.close()
# pool.join()
,因为主进程不可能比子进程更早完成。