2017-12-08 3 views
1

단일 서버의 단일 폴더에서 여러 파일을 다운로드해야하므로 더 빨리 수행 할 수있는 방법을 찾고 있습니다. 약간의 읽기 후에는 멀티 스레딩 또는 비동기 접근 방식이 효과가있을 것으로 보이지만 두 접근 방식 모두 작동하지 않는 것처럼 보입니다.단일 FTP 서버에서 다중 스레드/비동기 다운로드

내가 사용하는 비동기 접근 방식은 다음과 같습니다. 이 방법은 오류없이 작동하지만 한 번에 하나의 파일 만 다운로드하므로 속도가 향상되지 않습니다. 속도를 높이기 위해 그것을 수정해야합니까?

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을 호출하므로 다운로드 인스턴스가 하나만 실행됩니다. @ Klas-d 언급대로 this example을 참조하십시오.

0

저는 저자가 aioftp입니다. ftp에 대한 다운로드 속도를 실제로 높일 수없는 이유는 ftp 세션에 정확히 하나의 데이터 연결 제한이 있기 때문에 한 번에 하나의 클라이언트 연결을 통해 여러 파일을 다운로드 할 수 없으며 순차적으로 만 다운로드 할 수 있기 때문입니다. 또한 lazy list을 사용하기 때문에 코드가 작동하지 않습니다. 다운로드 속도를 높이려면 여러 클라이언트 세션이 필요하지만 서버가 다운로드 속도를 조절하지 않으면 속도가 향상되지 않습니다.

+0

감사합니다. – Dorian821

관련 문제