2016-07-19 10 views
4

私はディレクトリを毎秒スキャンし、新しいファイルをチェックし、もし現れたら、POST要求を介してそれらを送信し、アーカイブを実行するアプリケーションを書いています。ディレクトリに表示できるファイルの数を10から100までとすると、asyncioとaiohttpを使用してリクエストを同時に送信することにしました。asyncio。ループにコルーチンを動的に追加します

コード:

import os 
import aiohttp 
from aiohttp.client import ClientSession 

BASE_DIR = '/path/to' 
ARCHIVE_DIR = '/path/to/archive' 

async def scan(): 
    while True: 
     await asyncio.sleep(1) 
     for file in os.listdir(BASE_DIR): 
      if os.path.join(BASE_DIR, file).endswith('jpg'): 
       asyncio.ensure_future(publish_file(file)) 


async def publish_file(file): 
    async with ClientSession(loop=loop) as session: 
     async with session.post(url=url, data={'photo': open(os.path.join(BASE_DIR, file), 'rb')}) as response: 
      if response.status == 200: 
       await move_to_archive(file) 

async def move_to_archive(file): 
    os.rename(os.path.join(BASE_DIR, file), os.path.join(ARCHIVE_DIR, file)) 

loop = asyncio.get_event_loop() 

coros = [ 
    asyncio.ensure_future(scan()) 
] 
loop.run_until_complete(asyncio.wait(coros)) 

そこで質問です:私は同時要求を送信する場合、これは、このようなループにコルーチンを追加することをお勧めし:asyncio.ensure_future(publish_file(file))

答えて

5

はい、正しいです。

P.S.同じセッション(おそらく限られた量の並列接続)を共有する方が、すべての投稿要求で接続プールを再作成する方がよいでしょう。

session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=10)) 
関連する問題