不可能
starmap(),但是添加补丁是可能的
Pool.istarmap()。它基于的代码
imap()。您要做的就是创建
istarmap.py-file并导入模块以应用补丁,然后再进行常规的multiprocessing-
imports。
Python <3.8
# istarmap.py for Python <3.8import multiprocessing.pool as mppdef istarmap(self, func, iterable, chunksize=1): """starmap-version of imap """ if self._state != mpp.RUN: raise ValueError("Pool not running") if chunksize < 1: raise ValueError( "Chunksize must be 1+, not {0:n}".format( chunksize)) task_batches = mpp.Pool._get_tasks(func, iterable, chunksize) result = mpp.IMapIterator(self._cache) self._taskqueue.put( ( self._guarded_task_generation(result._job, mpp.starmapstar, task_batches), result._set_length )) return (item for chunk in result for item in chunk)mpp.Pool.istarmap = istarmap
Python 3.8以上
# istarmap.py for Python 3.8+import multiprocessing.pool as mppdef istarmap(self, func, iterable, chunksize=1): """starmap-version of imap """ self._check_running() if chunksize < 1: raise ValueError( "Chunksize must be 1+, not {0:n}".format( chunksize)) task_batches = mpp.Pool._get_tasks(func, iterable, chunksize) result = mpp.IMapIterator(self) self._taskqueue.put( ( self._guarded_task_generation(result._job, mpp.starmapstar, task_batches), result._set_length )) return (item for chunk in result for item in chunk)mpp.Pool.istarmap = istarmap
然后在您的脚本中:
import istarmap # import to apply patchfrom multiprocessing import Poolimport tqdmdef foo(a, b): for _ in range(int(50e6)): pass return a, bif __name__ == '__main__': with Pool(4) as pool: iterable = [(i, 'x') for i in range(10)] for _ in tqdm.tqdm(pool.istarmap(foo, iterable), total=len(iterable)): pass
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)