我正在尝试通过使用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())
答案 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()