У меня есть asyn c Python скрипт, который создает массовое задание / пакет API в Salesforce. После того, как пакет завершен, я загружаю файл CSV для обработки.
Вот моя проблема : Потоковая загрузка для файла CSV ~ 300 МБ с использованием Python может занять более 3 минут, используя этот асинхронный код:
Если вы знакомы с массовыми заданиями Salesforce, вы можете ввести свою информацию в указанные ниже переменные и загрузить результаты пакета для тестирования. Это рабочий пример кода при условии, что вы вводите необходимую информацию.
import asyncio, aiohttp, aiofiles
from simple_salesforce import Salesforce
from credentials import credentials as cred
sf_data_path = 'C:/Users/[USER NAME]/Desktop/'
job_id = '[18 DIGIT JOB ID]'
batch_id = '[18 DIGIT BATCH ID]'
result_id = '[18 DIGIT RESULT ID]'
instance_name = '[INSTANCE NAME]'
result_url = f'https://{instance_name}.salesforce.com/services/async/45.0/job/{job_id}/batch/{batch_id}/result/{result_id}'
sf = Salesforce(username=['SALESFORCE USERNAME'],
password=['SALESFORCE PASSWORD'],
security_token=['SALESFORCE SECURITY TOKEN'],
organizationId=['SALESFORCE ORGANIZATION ID'])
async def download_results():
err = None
retries = 3
status = 'Not Downloaded'
for _ in range(retries):
try:
async with aiohttp.ClientSession() as session:
async with session.get(url=result_url,
headers={"X-SFDC-Session": sf.session_id, 'Content-Encoding': 'gzip'},
timeout=300) as resp:
async with aiofiles.open(f'{sf_data_path}_DOWNLOAD_.csv', 'wb') as outfile:
while True:
chunk = await resp.content.read(10485760) # = 10Mb
if not chunk:
break
await outfile.write(chunk)
status = 'Downloaded'
except Exception as e:
err = e
retries -= 1
status = 'Retrying'
continue
else:
break
else:
status = 'Failed'
return err, status, retries
asyncio.run(download_results())
Однако, если я загружаю результат пакета в Developer Workbench: https://workbench.developerforce.com/asyncStatus.php?jobId= «[18 DI GIT JOB ID]» тот же файл может загружаться через 5 секунд.
Очевидно, что здесь происходит что-то, что я пропускаю Я знаю, что Workbench использует PHP, эта функция доступна даже с Python? Я полагал, что вызовы asyn c сделают эту загрузку быстрой, но это не делает загрузку такой же быстрой, как функциональность в браузере. Есть идеи?
Спасибо!