由于这是“Python多进程队列实现”的谷歌搜索结果,我将发布一个稍微更为概括的示例。
请考虑以下脚本:
import time
import math
import pprint
def main():
print('\n' + 'starting . . .' + '\n')
startTime = time.time()
my_list = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
result_list = []
for num in my_list:
result_list.append(squareNum(num))
elapsedTime = time.time() - startTime
print('result_list: ')
pprint.pprint(result_list)
print('\n' + 'program took ' + '{:.2f}'.format(elapsedTime) + ' seconds' + '\n')
def squareNum(num: float) -> float:
time.sleep(1.0)
return math.pow(num, 2)
if __name__ == '__main__':
main()
这个脚本声明了10个浮点数,对它们进行平方运算(每次平方都会睡眠1秒钟以模拟一些重要的过程),然后将结果收集到一个新列表中。这需要大约10秒钟才能运行完毕。
下面是使用Multiprocessing Process和Queue进行重构的版本:
from multiprocessing import Process, Queue
import time
import math
from typing import List
import pprint
def main():
print('\n' + 'starting . . .' + '\n')
startTime = time.time()
my_list = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
result_list = []
multiProcQueue = Queue()
processes: List[Process] = []
for num in my_list:
processes.append(Process(target=squareNum, args=(num, multiProcQueue,)))
for process in processes:
process.start()
for process in processes:
process.join()
while not multiProcQueue.empty():
result_list.append(multiProcQueue.get())
elapsedTime = time.time() - startTime
print('result_list: ')
pprint.pprint(result_list)
print('\n' + 'program took ' + '{:.2f}'.format(elapsedTime) + ' seconds' + '\n')
def squareNum(num: float, multiProcQueue: Queue) -> None:
time.sleep(1.0)
result = math.pow(num, 2)
multiProcQueue.put(result)
if __name__ == '__main__':
main()
这个脚本大约在1秒内运行。据我所知,这是同时让多个进程并行地写入相同数据结构的最干净的方法。我希望https://docs.python.org/3/library/multiprocessing.html 文档中有像这样的示例。
注意结果列表的顺序通常不会与输入列表的顺序匹配,如果必须维护顺序,则需要使用不同的方法。
pool.map
已经为您提供的吗? - a spaghetto