Я новичок в этой области и пытаюсь найти функцию, которая выполнит следующее:
- Считывание данных из базы данных Oracle с использованием больших кусков (50000 строк).
- Для каждого чтения чанка я хочу порождать поток или процесс или что-то подобное, что будет асинхронно буферизовать кусок данных (используя CVS_Writer) в файл.
- Я не хочузаблокировать задачу чтения данных, чтобы дождаться завершения операции буферизации.
Я посмотрел на что-то вроде ниже.Обновлен код с импортом и убрано использование очереди.Вместо этого передача данных напрямую в функцию печати.
--------------------------------------------------------------
from __future__ import print_function
import cx_Oracle
import csv
import time
import datetime
from multiprocessing import Pool
from multiprocessing import Queue
def PrintRows(rows):
rows=q.get()
if not rows:
return -1;
csvf = open('sales_history.csv', 'a')
csv_writer = csv.writer(csvf,delimiter='|')
print ("In PrintRows function : ")
csv_writer.writerows(rows)
csvf.close()
return 0
def TheMainQuery():
conn = pool.acquire()
cursor = conn.cursor()
cursor.arraysize = 80000
cursor.execute("""
select *
from
sales_history
""")
rows = cursor.fetchmany()
while rows:
if not rows:
break;
q.put(rows)
print("launching async proc")
with Pool(processes=2) as ppool:
result = ppool.apply_async(PrintRows,(rows,))
print("Done launching async process")
rows = cursor.fetchmany()
TheMainQuery()
elapsed_time = time.time() - start_time
print("All done!\n")
return
---------------------------------------------------------
Проблема: запись данных в файл вообще не производится.Af, если функция не выполняется вообще.Моя цель состоит в том, чтобы задание спулинга выполнялось асинхронно.Любые советы / образцы будут высоко оценены.
спасибо большое !!!.