多处理比顺序Python 3.5

时间:2017-01-03 13:33:03

标签: python python-3.x multiprocessing

我正在尝试使用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。

1 个答案:

答案 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() ,因为主进程不可能比子进程更早完成。

相关问题