繁体   English   中英

使用Python多重处理apply_async写入csv会导致数据丢失

[英]Write to csv with Python Multiprocessing apply_async causes missing of data

我有一个csv文件,在其中逐行读取url以对每个点进行请求。 解析每个请求,并将数据写入output.csv。 这个过程是并行的。

问题与书面数据有关。 数据的某些部分被部分丢失或完全丢失(空白行)。 我想这是由于异步进程之间的冲突或冲突而发生的。 您能建议如何解决该问题。

def parse_data(url, line_num):
    print line_num, url
    r = requests.get(url)
    htmltext = r.text.encode("utf-8")
    pois = re.findall(re.compile('<pois>(.+?)</pois>'), htmltext)
    for poi in pois:
        write_data(poi)

def write_data(poi):
    with open('output.csv', 'ab') as resfile:
        writer = csv.writer(resfile)
        writer.writerow([poi])
    resfile.close()

def main():
    pool = Pool(processes=4)

    with open("input.csv", "rb") as f:
        reader = csv.reader(f)
        for line_num, line in enumerate(reader):
            url = line[0]
            pool.apply_async(parse_data, args=(url, line_num))

    pool.close()
    pool.join()

尝试添加文件锁定:

import fcntl

def write_data(poi):
    with open('output.csv', 'ab') as resfile:
        writer = csv.writer(resfile)
        fcntl.flock(resfile, fcntl.LOCK_EX)
        writer.writerow([poi])
        fcntl.flock(resfile, fcntl.LOCK_UN)
     # Note that you dont have to close the file. The 'with' will take care of it

并发写入同一文件确实是导致数据丢失/文件损坏的已知原因。 此处的安全解决方案是“映射/缩小”模式-每个进程都将其写入自己的结果文件(映射),然后将这些文件连接在一起(缩减)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM