2017-12-08 5 views
1

単一のサーバー内の単一のフォルダから多数のファイルをダウンロードする必要があるため、より迅速に行う方法を探しています。少し読んだら、マルチスレッドまたは非同期のどちらの方法でもうまくいくように思えますが、いずれのアプローチも動作しないようです。単一のFTPサーバーからのマルチスレッド/非同期ダウンロード

私が使用している非同期の方法は以下のとおりです。これは動作します。つまり、エラーは発生しませんが、一度に1つのファイルしかダウンロードされないため、スピードは向上しません。速度を改善するためにそれを修正するために離れていますか?

async def get_file(self): 
    async with aioftp.ClientSession(self.host, self.port, self.login, self.password) as client: 
     async for path, info in client.list(recursive=True): 
      if info["type"] == "file": 
       await client.download(path, destination=self.dest_dir,write_into=True, block_size=self.block_size) 


def async_update(self): 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(self.get_file()) 
    loop.close() 

は、その後、私は以下のようにマルチプロセッシングでは、単純なプール()FUNCを使用してみました:

def simple_fetch(self,file)  
    file = open(self.dest_dir+filename, 'wb') 
    ftp.retrbinary('RETR ' + filename, file.write, 8192*(2^3)) #, 8192) 
    file.close() 

def multi_fetch(self): 
    pool = Pool() 
    pool.map(self.simple_fetch,self.update_files) 
    pool.close() 
    pool.join() 

しかし、これはエラーで失敗します。私がサーバーに戻ったらすぐにそのエラーを更新します。

+1

この例をご覧ください:https://docs.python.org/3/library/asyncio-task.html#example-parallel-execution-of-tasks –

答えて

1

非同期のアプローチでは、ダウンロードして同時に呼び出すファイルのリストを作成する必要があります。あなたはsimple_getを一度しか呼び出していないので、実行中のダウンロードインスタンスは1つしかありません。 @ Klas-dが述べられているようにthis exampleを参照してください。

0

私はaioftpの著者です。あなたが実際にftpのダウンロードをスピードアップできない理由は、ftpセッションにはちょうど1つのデータ接続の制限があるため、同時に1つのクライアント接続で複数のファイルをダウンロードすることはできません。また、lazy listを使用しているため、コードが機能しません。あなたのダウンロードをスピードアップしようとするなら、あなたは複数のクライアントセッションが必要ですが、サーバがダウンロードスピードを制限しない場合、スピードアップはありません。

+0

説明してくれてありがとうございます。 – Dorian821

関連する問題