2
理想情況下,我想要做的就是在Python中複製這個bash管道(我在這裏使用cut
來表示一些數據的任意轉換,實際上我想用pandas
來做到這一點) :從Python的ftplib管道不阻塞
curl ftp://hgdownload.cse.ucsc.edu/goldenPath/hg38/database/refFlat.txt.gz | gunzip | cut -f 1,2,4
我可以用Python語言編寫下面的代碼,達到同樣的目的
# 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,這是不同的。 –