使用Python多处理apply_async写入csv导致缺少d

2024-04-24 10:53:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,在那里我逐行读取url,为每个enpoint发出请求。对每个请求进行解析,并将数据写入输出.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()

Tags: csv数据urldataparsedeflinenum
2条回答

尝试添加文件锁定:

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

对同一个文件的并发写入确实是导致数据丢失/文件损坏的已知原因。然后在“reduce/result”模式中(将每个文件串联在一起)将其写入“result”。在

相关问题 更多 >