如果使用
pool.map_async,则可以将此信息从
MapResult返回的实例中拉出。例如:
import multiprocessingimport timedef worker(i): time.sleep(i) return iif __name__ == "__main__": pool = multiprocessing.Pool() result = pool.map_async(worker, range(15)) while not result.ready(): print("num left: {}".format(result._number_left)) time.sleep(1) real_result = result.get() pool.close() pool.join()
输出:
num left: 15num left: 14num left: 13num left: 12num left: 11num left: 10num left: 9num left: 9num left: 8num left: 8num left: 7num left: 7num left: 6num left: 6num left: 6num left: 5num left: 5num left: 5num left: 4num left: 4num left: 4num left: 3num left: 3num left: 3num left: 2num left: 2num left: 2num left: 2num left: 1num left: 1num left: 1num left: 1
multiprocessing在内部将传递给它的可迭代项
map分成多个块,并将每个块传递给子进程。因此,该
_number_left属性实际上会跟踪剩余
块
的数量,而不是可迭代对象中的各个元素。如果在使用大型可迭代项时看到奇数,请记住这一点。它采用分块,以提高IPC性能,但如果看到完成结果的准确理货是你比增加的性能更重要的是,你可以使用
chunksize=1关键字argumment来
map_async作出
_num_left更准确。(
chunksize通常只对非常大的可迭代对象产生明显的性能差异。请自己尝试一下,以查看它对用例是否真的很重要)。
正如您在评论中提到的那样,由于
pool.map被阻塞,除非您要启动一个后台线程来进行轮询,而主线程在
map调用中被阻塞,否则您将无法真正获得此消息,但是我不确定这样做有什么好处以上方法。
要记住的另一件事是,您使用的是内部属性
MapResult,因此这可能会在将来的Python版本中中断。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)