通过异步进程写入文件时数据丢失(apply_async)

时间:2018-10-21 20:51:24

标签: file asynchronous

我有一个在Python 3.6.3中执行以下操作的过程: 1.使用cx_Oracle(7.x)从Oracle读取数据 2.我在游标中使用了较大的块大小,即80000行。 3.在使用带有32个进程池的apply_async批量读取游标的同时,每个进程都写入一个单独的文件。 4. apply_async调用调用的函数从队列中获取数据并打开一个新文件,然后将数据写入该文件并关闭它。

我总是看到最终输出中随机丢失数据。通常是80K +行。好像其中一个进程未将数据写入文件,或者某些进程正在将较少的数据写入其单个文件。我已验证我使用len(rows)命令从数据库中读取了正确的行数,以确保在写入文件之前已读取所有数据。

代码有点像这样:

from __future__ import print_function

import cx_Oracle
import csv
import time
import datetime
from multiprocessing import Pool
from multiprocessing import Queue

pool = cx_Oracle.SessionPool(....., threaded = True)
queue1 = Queue()
def WriteRowsToFile(fname):
    rows=q.get()
    csvf = open(flname, 'w')
    csv_writer = csv.writer(csvf)
    csv_writer.writerows(rows)
    csv_writer.flush()
    csvf.close()
    return 0

def TheBigQuery():
    ctr = 0
    totalrows = 0
    fname='TestFile.txt'
    ppool = Pool(processes=32)
        conn = pool.acquire()
    cursor = conn.cursor()
    cursor.arraysize = 80000
       cursor.execute("""
      SELECT * FROM TEMP_EMP
                """)

    while True:
        rows = cursor.fetchmany()
        totalrows = totalrows + cursor.rowcount
        if not rows:
           break;
        q.put(rows)
        ctr = ctr + 1
        fname = 'Testfile'+str(ctr)+'.txt'

        result = ppool.apply_async(WriteRowsToFile,(fname,))     

    print("Total number of rows written : ")
    print(totalrows)

    ppool.close()
    ppool.terminate()
    return


TheBigQuery()

我对文件中的数据丢失感到有些惊讶,因为每个进程在每次调用时都会写入自己的文件。除非apply_async进程以某种方式将任务分配给正在忙于写入文件的进程,并且在该时间范围内,否则它不会写入新数据。如何调试并解决问题?

提示/指针将不胜感激。非常感谢。

0 个答案:

没有答案