代码的目标是读取sqlite3文件并处理文本并写入另一个文件(gzip格式)。我正在尝试使用池进行多处理,但是 有时它会生成错误并停止并显示错误消息"当该文件已存在时无法创建文件"。失败后,如果我重复相同的代码,它在大多数情况下工作正常,这意味着偶尔会发生这种情况。
我猜这与池中进程之间的竞争有关,但无法找到解决问题的方法。通常它工作得很好,但有时它会导致问题。
此外,我尝试在每个目录级别终止所有进程,并在下一个目录中启动新进程。
P.S。环境:Windows服务器64位,Python 2.7 64位
import sqlite3 as lite
import gzip
import multiprocessing
def convert_txt((infile,outfile)):
try:
conn=lite.connect(infile)
conn.text_factory = str
except:
print 'Sql Lite error:', infile
return
try:
fout = gzip.open(outfile, 'wb')
except:
'File write error:', outfile
return
for line in conn.iterdump():
fout.write(line.replace('abc','def')
fout.close()
for directory in directory_list:
filenames=glob.glob('B:\\Hebercity UT\\*.txt')
p = multiprocessing.Pool(min(10,len(filenames)))
file_list=[]
for input_file in filenames:
output_file=input_file.replace('.txt','.csv')
file_list.append([input_file, output_file])
p.map(convert_txt, file_list)
time.sleep(1)
p.close() # close the pool and start the pool in the next directory
Traceback (most recent call last):
File "B:\gws_txt_converter_multi.py", line 100, in <module>
p.map(convert_txt_msg, fflist)
File "C:\opt\Anaconda\lib\multiprocessing\pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "C:\opt\Anaconda\lib\multiprocessing\pool.py", line 558, in get
raise self._value
WindowsError: [Error 183] Cannot create a file when that file already exists: 'B:\\Hebercity UT'