使用python多处理模块递增/递减全局变量
我正在尝试启动多个进程来并行化某些任务,并希望每次进程执行方法X()时,一个全局变量减少1 我试图查看multiprocessing.Value方法,但不确定这是否是唯一的方法。有人能提供一些代码片段来做这件事吗使用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']
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()的参数)