6

ディレクトリを毎秒スキャンし、新しいファイルをチェックし、それらが表示された場合は、POST 要求を介して送信し、アーカイブを実行するアプリを作成しています。ディレクトリに表示できるファイルの数が 10 から 100 であると仮定すると、リクエストを同時に送信するために asyncio と aiohttp を使用することにしました。

コード:

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))?

4

1 に答える 1

5

はい、正しいです。

PSポストリクエストごとに接続プールを再作成するよりも、同じセッションを共有する方が良いです(おそらく、並列接続の量が限られています):

session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=10))
于 2016-07-19T22:15:40.237 に答える