【问题标题】:Monitoring progress in Python parallel processes监控 Python 并行进程的进度
【发布时间】:2015-03-31 09:25:17
【问题描述】:

以下代码返回错误:

local variable 'count' referenced before assignment.

下面是两个函数:

def run():
    ...
    global count
    count = 0
    with closing(Pool(processes=4)) as pool:
    pool.map(run_in_parallel, listOfIds)
    pool.terminate()
    ...

def run_in_parallel(id):
    count += 1
    if count % 1000 == 0:
        print('Processed %d %s' % (count, time.strftime('%x %X')))
    # Do main work in parallel

错误只是因为修改语句而弹出。即

count +=1

我在几个地方读到过,在工作进程中修改全局变量不是一个好习惯。但由于 listOfIds 是一个巨大的列表,我需要一些方法来监控进度并偶尔打印到终端。这要怎么做?

我已阅读 StackOverflow 和其他地方的其他帖子,其他问题均未解决上述完全相同的问题。

【问题讨论】:

  • 在多处理程序中使用和访问全局变量不会像您期望的那样工作
  • 这是一个很好的例子/说明如何实现共享计数器:eli.thegreenplace.net/2012/01/04/…

标签: python parallel-processing global-variables counter python-multiprocessing


【解决方案1】:

错误的发生很可能是因为您没有像在 run() 函数中那样通过 global count 使全局变量 count 可用。

无论如何,这不会像您希望的那样工作。每个生成的进程都有自己的全局 count 变量,它会递增,并且在创建时始终为 0

如果你想这样算,你应该使用 Tom Dalton 为你链接的例子:

import time
from multiprocessing import Process, Value

def func(val):
    for i in range(50):
        time.sleep(0.01)
        val.value += 1

if __name__ == '__main__':
    v = Value('i', 0)
    procs = [Process(target=func, args=(v,)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多