Python 如何将进度条与多处理同步
我有一个VueJs前端,一个python烧瓶后端,我使用的是Google Firebase数据库 在某些任务中,会向用户显示进度条。为了实现bar,后端将累进值写入数据库,前端读取 我更改了后端,因为它太慢了,所以我使用multiprocessing.Pool并行化了一些操作。我有一个很好的性能改进,但现在进步栏有时会继续,然后回来,因为有更多的进程正在访问数据库 我在这里创建池:Python 如何将进度条与多处理同步,python,firebase,google-cloud-firestore,multiprocessing,Python,Firebase,Google Cloud Firestore,Multiprocessing,我有一个VueJs前端,一个python烧瓶后端,我使用的是Google Firebase数据库 在某些任务中,会向用户显示进度条。为了实现bar,后端将累进值写入数据库,前端读取 我更改了后端,因为它太慢了,所以我使用multiprocessing.Pool并行化了一些操作。我有一个很好的性能改进,但现在进步栏有时会继续,然后回来,因为有更多的进程正在访问数据库 我在这里创建池: i = 1 num_workers = multiprocessing.cpu_count() pool = mu
i = 1
num_workers = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=num_workers)
for filename in glob.glob(os.path.join(files_path, '*')):
pool.apply_async(create_single_model, (filename, models_path, num_model_photos, uid, i))
print('Process: ' + str(i))
i = i + 1
在create_single_model
I passI
并增加它,但我认为它不正确:
.
some operations...
.
percentage = round((i / num_model_photos) * 100)
i = i + 1
ref = fb.db.collection('users').document(uid).get()
actual_percentage = ref.to_dict()['running']
if percentage != actual_percentage:
fb.db.collection('users').document(uid).set({
'running': percentage
}, merge=True)
看起来每个子流程都在计算自己的进度,而不是总体进度。您需要一个可由每个子流程访问的共享变量来存储总体进度。作业完成后,每个子流程都可以将该变量增加1 回答如下:
我想出了一个简单的例子:
import time
from multiprocessing import Pool, Value
def some_func(n):
for _ in range(n):
with cnt.get_lock():
cnt.value += 1
print('\r{:.0%}'.format(cnt.value / 100), end='')
time.sleep(0.1)
def init_globals(counter):
global cnt
cnt = counter
if __name__ == "__main__":
counter = Value('i', 0)
with Pool(initializer=init_globals, initargs=(counter,), processes=2) as pool:
multi_results = pool.starmap(some_func, [(50,), (50,)])