我有一个下载器功能,可以并行下载多个文件。我使用multiprocessing.Pool.map_async以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数(total_bytes_dl)。
multiprocessing.Pool.map_async
total_bytes_dl
pool = multiprocessing.Pool(processes) mapObj = pool.map_async(f, args) while not mapObj.ready(): status = r"%.2f MB / %.2f MB" % (total_bytes_dl / 1024.0 / 1024.0, filesize / 1024.0 / 1024.0,) status = status + chr(8)*(len(status)+1) print status, time.sleep(0.5)
是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数?
解决方案是利用新进程并传递共享的ctypes值:
from ctypes import c_int import dummy shared_bytes_var = multiprocessing.Value(c_int) def Func(...): .... pool = multiprocessing.Pool(initializer=_initProcess,initargs=(shared_bytes_var,)) .... def _initProcess(x): dummy.shared_bytes_var = x