Python多处理由于进程竞争条件导致的池冲突(文件写入)

时间:2016-03-16 23:36:12

标签: python multiprocessing race-condition

代码的目标是读取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'

0 个答案:

没有答案