多处理和全局管理器

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 之前定义,但似乎 foobarload_stuff 彼此相邻。

我不太清楚你的功能是如何布局的。也许您需要在某处额外声明 dict1dict2 作为模块级变量(同时保持全局语句不变)。


话虽如此,我认为您在并发程序中访问共享变量的方法并不符合惯例。