计算多处理中执行的任务总数执行期间的池

计算多处理中执行的任务总数执行期间的池,第1张

计算多处理中执行的任务总数执行期间的池

如果使用

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版本中中断。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存