这是使用python多处理队列的正确方法吗?

时间:2017-06-26 04:04:20

标签: python performance queue append multiprocessing

我正在尝试通过使用Python进行多处理来加速我的代码。我尝试实现多处理时遇到的唯一问题是我的函数有一个return语句,我需要将该数据保存到列表中。我发现使用谷歌的最好方法是使用队列作为“q.put()”并使用“q.get()”检索它。唯一的问题是我认为我没有以正确的方式使用它,因为当我在编译后使用命令提示符时,它显示我几乎不使用我的cpu而且我只看到一个Python进程正在运行。如果我删除“q.get()”,该过程超级快,并利用我的CPU。我这样做是正确的吗?

import time
import numpy as np
import pandas as pd
import multiprocessing 
from multiprocessing import Process, Queue


def test(x,y,q):

    q.put(x * y)


if __name__ == '__main__':

    q = Queue()

    one = []
    two = []
    three = []

    start_time = time.time()


    for x in np.arange(30, 60, 1):
        for y in np.arange(0.01, 2, 0.5):

            p = multiprocessing.Process(target=test, args=(x, y, q))
            p.start()
            one.append(q.get())
            two.append(int(x))
            three.append(float(y))
            print(x, ' | ', y, ' | ', one[-1])

    p.join()

    print("--- %s seconds ---" % (time.time() - start_time))

    d = {'x' : one, 'y': two, 'q' : three}
    data = pd.DataFrame(d)
    print(data.tail())

1 个答案:

答案 0 :(得分:1)

不,这不正确。您启动一个流程并立即通过q.get等待结果。因此,只有一个进程同时运行。如果您要执行许多任务,请使用multiprocessing.Pool

import time
import numpy as np
from multiprocessing import Pool
from itertools import product

def test((x,y)):
    return x, y, x * y

def main():
    start_time = time.time()
    pool = Pool()
    result = pool.map(test, product(np.arange(30, 60, 1), np.arange(0.01, 2, 0.5)))
    pool.close()
    print("--- %s seconds ---" % (time.time() - start_time))
    print(result)

if __name__ == '__main__':
    main()