В идеале, что я хотел бы сделать, это реплицировать этот конвейль bash в python (я использую cut
здесь, чтобы представить произвольное преобразование данных. Я действительно хочу использовать pandas
, чтобы это сделать) :Трубопровод от ftplib от Python без блокировки
curl ftp://hgdownload.cse.ucsc.edu/goldenPath/hg38/database/refFlat.txt.gz | gunzip | cut -f 1,2,4
Я могу написать следующий код питона, который достигает той же цели
# Download the zip file into memory
file = io.BytesIO()
ftp = ftplib.FTP('hgdownload.cse.ucsc.edu')
ftp.retrbinary(f'RETR goldenPath/{args.reference}/database/refFlat.txt.gz', file.write)
# Unzip the gzip file
table = gzip.GzipFile(fileobj=file)
# Read into pandas
df = pd.read_csv(table)
Однако, блоки ftp.retrbinary()
вызовов, и ждет всей загрузки. Я хочу иметь один длинный двоичный поток с файлом FTP в качестве источника с gunzip
в качестве фильтра и pd.read_csv()
в качестве раковины, одновременно обрабатывая данные, как в моем проекте bash. Есть ли способ остановить retrbinary()
от блокировки?
Я понимаю, что это невозможно, потому что python не может использовать более одного потока. Это правда? Если да, то я могу использовать multiprocessing
или async
или какой-либо другой функции языка, чтобы достичь этого одновременного Трубопроводный
редактировать: изменены storbinary
к retrbinary
, это была опечатка и проблема все еще стоит
Python может полностью использовать несколько потоков. Вы думаете о GIL, который отличается. –