Python 如何将进度条与多处理同步

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

我有一个VueJs前端,一个python烧瓶后端,我使用的是Google Firebase数据库

在某些任务中,会向用户显示进度条。为了实现bar,后端将累进值写入数据库,前端读取

我更改了后端,因为它太慢了,所以我使用multiprocessing.Pool并行化了一些操作。我有一个很好的性能改进,但现在进步栏有时会继续,然后回来,因为有更多的进程正在访问数据库

我在这里创建池:

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 pass
I
并增加它,但我认为它不正确:

.
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,)])