使用python多处理模块递增/递减全局变量

使用python多处理模块递增/递减全局变量,python,global-variables,shared-memory,python-multiprocessing,Python,Global Variables,Shared Memory,Python Multiprocessing,我正在尝试启动多个进程来并行化某些任务,并希望每次进程执行方法X()时,一个全局变量减少1 我试图查看multiprocessing.Value方法,但不确定这是否是唯一的方法。有人能提供一些代码片段来做这件事吗 from multiprocessing import Pool, Process def X(list): global temp print list temp = 10 temp -= 1 return temp list = ['a','b','c']

我正在尝试启动多个进程来并行化某些任务,并希望每次进程执行方法X()时,一个全局变量减少1

我试图查看multiprocessing.Value方法,但不确定这是否是唯一的方法。有人能提供一些代码片段来做这件事吗

from multiprocessing import Pool, Process

def X(list):
  global temp
  print list
  temp = 10
  temp -= 1
  return temp

list = ['a','b','c']
pool = Pool(processes=5)
pool.map(X, list)

通过使用全局变量,每个进程都会获得其自身的全局变量副本,这并不能解决共享其值的目的。我认为,我们需要一种共享内存系统,但我不知道如何做到这一点。谢谢

计数器
变量移动到主进程中,即避免在进程之间共享变量:

for result in pool.imap_unordered(func, args):
    counter -= 1
当相应的结果(
func(arg)
)可用时,
计数器将立即递减。下面是一个完整的代码示例:

#!/usr/bin/env python
import random
import time
import multiprocessing

def func(arg):
    time.sleep(random.random())
    return arg*10

def main():
    counter = 10
    args = "abc"
    pool = multiprocessing.Pool()
    for result in pool.imap_unordered(func, args):
        counter -= 1
        print("counter=%d, result=%r" % (counter, result))

if __name__ == "__main__":
    main()

另一种方法是将
multiprocessing.Value()
对象传递给每个工作进程(使用
initialize
initargs
Pool()
的参数)。

我想您正在寻找Python线程支持——具体来说,是一个信号量。不是真的。我想使用多个进程,但也需要一个共享变量。线程可以解决共享变量问题,但不能解决我需要多个进程的其他问题。谢谢J.F。我如何使用map_unordered传递多个参数?在这种方法中我需要显式锁吗?@psbits:这里不需要互斥<代码>计数器
仅在单个进程(主进程)中访问--
计数器
在此甚至可能是本地计数器。不确定,这种方法似乎不适合我,或者如果我做错了什么。我在我的主函数中声明了计数器,并调用了我的func,它返回一些字符串。但是计数器值仍然与原始值相等。谢谢J.F。让它工作起来。但我最终对每个工作进程使用了-multiprocessing.Value()对象(使用initialize,initargs Pool()的参数)