我正在做一些并行处理,如下所示:
with mp.Pool(8) as tmpPool:
results = tmpPool.starmap(my_function, inputs)
输入如下:
[(1,0.2312),(5,0.52)…]
即int和float的元组。
代码运行良好,但我似乎无法将它包装在加载条(TQM)上,例如可以使用以下IMAP方法完成:
tqdm.tqdm(mp.imap(some_function,some_inputs))
星图也能做到吗?
谢谢!
最佳答案
使用starmap()
是不可能的,但是使用添加Pool.istarmap()
的修补程序也是可能的。它基于imap()
的代码。您只需创建istarmap.py
-文件并导入模块以应用修补程序,然后再进行常规的多处理导入。
# istarmap.py
import multiprocessing.pool as mpp
def 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
那么在你的剧本里:
import istarmap # import to apply patch
from multiprocessing import Pool
import tqdm
def foo(a, b):
for _ in range(int(50e6)):
pass
return a, b
if __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
关于python - 星图结合tqdm?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57354700/