并行线程上的会话 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
指的是那个单独的实例,而不是为每个文件夹重新使用相同的实例。
所以我正在尝试使用 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
指的是那个单独的实例,而不是为每个文件夹重新使用相同的实例。