并行线程上的会话 ID 问题

Problems with session ids on parallel threads

所以我正在尝试使用 multiprocessing 来同时遍历不同文件夹中的文件。我有一个调用并行进程的函数:

from multiprocessing.dummy import Pool

lsFolders = ['Folder1', 'Folder2']

pool = Pool( processes = 6 )

iterateThroughFiles = IterateThroughFiles() # instantiated by call to pool.map()

pool.map( iterateThroughFiles.runProcess, lsFolders )

然后我执行了IterateThroughFiles-class:

class IterateThroughFiles( object ):

  def runProcess( self, folder ):
      self.sessionId = uuid.uuid4()
      print( self.sessionId )             # Prints a correct sessionId
      logAtLevel( "INFO", "Session ID of: "
                         + str( self.sessionId )
                         + " has been generated for folder: "
                         + folder
                           )

      print( self.sessionId )             # Prints only the second generated
      #                                   # session id for both threads
      print( folder )                     # Prints the correct folder

当我生成 sessionId 并在之后直接打印时, sessionId 是正确的,此外 logAtLevel() 包装函数记录 sessionId.

的正确值

不过,下一个打印语句只打印第二个会话 ID,显然第一个 sessionId 在线程中被遗忘了。

有人知道为什么会这样吗?我想当 运行 并行时,每个线程在它创建的对象和它的内存方面是不同的?这是不正确的吗?这与 uuid 生成器有关吗?

问题是您只生成了一个 IterateThroughFiles 的实例,它被两个线程使用。 相反,你想要像下面这样的东西

def factory(folder):
    return IterateThroughFiles().runProcess(folder)

并将该工厂函数传递到映射中。 这样你会得到两个实例。

pool.map(iterateThroughFiles.runProcess, lsFolders)

在这一行中,您在 class IterateThroughFiles 的单个实例上多次调用 runProcess。如果您将每个实例视为一个会话,则需要为 lsFolders 中的每个文件夹实例化一个新对象。

from multiprocessing.dummy import Pool

lsFolders = ['Folder1', 'Folder2']

pool = Pool(processes=6)

def worker(folder):
    p = IterateThroughFiles()
    p.runProcess(folder)

pool.map(worker, lsFolders)

这样,worker 函数会为每个文件夹创建一个 IterateThroughFiles 的新实例,这样在 runProcess 函数中,self 指的是那个单独的实例,而不是为每个文件夹重新使用相同的实例。