在并发Python中创建进度计数器
这基本上是python程序的缩短版本。我外面没有包装器类,我希望里面有一个计数器来跟踪进度(这样我就知道程序什么时候停止)。但是程序(在并发Python中创建进度计数器,python,Python,这基本上是python程序的缩短版本。我外面没有包装器类,我希望里面有一个计数器来跟踪进度(这样我就知道程序什么时候停止)。但是程序(def covertedFile()在访问更改的变量时遇到问题:alreadyProcessedFile和processLength) 我知道并发性在共享状态下可能会有问题,但是如果没有某种程度的共享状态,如何实现计数器??为什么并发函数不能访问它之外的变量 听起来也很奇怪,这个并发版本程序不能处理一个目录下的所有文件(大约5000个)。我想知道程序是否在某些进
def covertedFile()
在访问更改的变量时遇到问题:alreadyProcessedFile
和processLength
)
我知道并发性在共享状态下可能会有问题,但是如果没有某种程度的共享状态,如何实现计数器??为什么并发函数不能访问它之外的变量
听起来也很奇怪,这个并发版本程序不能处理一个目录下的所有文件(大约5000个)。我想知道程序是否在某些进程仍在运行时关闭。这是可能的吗?多处理在启动新进程时为每个进程创建内存副本。通过模块级全局文件共享状态不起作用,因为每个进程在分叉进程时都会获得自己的全局文件“快照”。更改一个进程的全局不会神奇地传播到其他进程
如果需要在进程之间共享状态,则需要使用
多处理
提供给您的工具之一。您可以通过Value
或Array
共享c类型,或使用Manager
共享任意数据类型。有关详细信息和示例,请参见文档中的。不幸的是,我没有使用流程,而是使用池
,因此如何通过池
构造传入额外参数?
from multiprocessing import Process, Pool
from bs4 import BeautifulSoup
alreadyProcessedFile = 0.0
processLength = 0.0
def convertedFile(filePath):
fileName = os.path.basename(filePath).split('.')[0]
print("Total: "+str(processLength)+", current: "+str(alreadyProcessedFile)
+ ", percentage: "+ str((alreadyProcessedFile+1.0)/(processLength+1)))
#business logic
print("One file is saved at the location: "+r'E:\xxx\SECProject\ProcessedSEC10KFiles\2012QTR1/'+fileName+'-finalDoc.txt')
def getFilePath(path):
return glob.glob(os.path.join(path, '*.txt'))
if __name__ == '__main__':
s = r"E:\xxx\SECProject\SEC10KFiles\2012QTR1"
fileList = getFilePath(s)
processLength = len(fileList)
p = Pool(40)
p.map(convertedFile, fileList)