多处理和全局管理器
Multiprocessing and a global manager
我有
import concurrent.futures
from multiprocessing import Process,Manager,freeze_support
from functools import partial
def setup():
freeze_support()
global manager
manager=Manager()
global dict1
dict1=manager.dict()
global dict2
dict2=manager.dict()
load_stuff()
及以后:
def foo(file):
#do some stuff
foobar()
def foobar():
#look up some stuff in dict1,dict2
def load_stuff():
f=partial(foo,dict1,dict2)
with concurrent.futures.ProcessPoolExecutor() as executor:
for users, tweets in executor.map(f, list_of_files):
但我不断收到
NameError: global name 'dict1' is not defined
基本上:我生成了多个进程,这些进程在做一些工作时调用一个函数来查找两个字典中的值。字典是全局的,因为当我可能只调用 foo() 和 foobar() 而不是在新进程中时我需要它们。进程无法访问字典。我该如何解决这个问题?
编辑:我最终使 dict1 成为一个普通的全局字典,然后将它作为一个变量传递给 f,然后在 f 中将其重新声明为全局,并且它起作用了。内存效率不高,但这个过程只运行一次并且字典只使用大约 45mb。
因为默认参数值是在编译时绑定的,所以这应该有效:
def foobar(dict1=dict1, dict2=dict2):
pass
等等,所以 load_stuff
需要在 setup
之前定义,而 setup
需要在 foobar
之前定义,但似乎 foobar
和 load_stuff
彼此相邻。
我不太清楚你的功能是如何布局的。也许您需要在某处额外声明 dict1
和 dict2
作为模块级变量(同时保持全局语句不变)。
话虽如此,我认为您在并发程序中访问共享变量的方法并不符合惯例。
我有
import concurrent.futures
from multiprocessing import Process,Manager,freeze_support
from functools import partial
def setup():
freeze_support()
global manager
manager=Manager()
global dict1
dict1=manager.dict()
global dict2
dict2=manager.dict()
load_stuff()
及以后:
def foo(file):
#do some stuff
foobar()
def foobar():
#look up some stuff in dict1,dict2
def load_stuff():
f=partial(foo,dict1,dict2)
with concurrent.futures.ProcessPoolExecutor() as executor:
for users, tweets in executor.map(f, list_of_files):
但我不断收到
NameError: global name 'dict1' is not defined
基本上:我生成了多个进程,这些进程在做一些工作时调用一个函数来查找两个字典中的值。字典是全局的,因为当我可能只调用 foo() 和 foobar() 而不是在新进程中时我需要它们。进程无法访问字典。我该如何解决这个问题?
编辑:我最终使 dict1 成为一个普通的全局字典,然后将它作为一个变量传递给 f,然后在 f 中将其重新声明为全局,并且它起作用了。内存效率不高,但这个过程只运行一次并且字典只使用大约 45mb。
因为默认参数值是在编译时绑定的,所以这应该有效:
def foobar(dict1=dict1, dict2=dict2):
pass
等等,所以 load_stuff
需要在 setup
之前定义,而 setup
需要在 foobar
之前定义,但似乎 foobar
和 load_stuff
彼此相邻。
我不太清楚你的功能是如何布局的。也许您需要在某处额外声明 dict1
和 dict2
作为模块级变量(同时保持全局语句不变)。
话虽如此,我认为您在并发程序中访问共享变量的方法并不符合惯例。