ASYNCIO。动态添加协程到循环

时间:2016-07-19 19:27:24

标签: python python-3.5 python-asyncio aiohttp

我正在编写应用程序,它每秒扫描目录,检查新文件,如果它们出现 - 通过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))

1 个答案:

答案 0 :(得分:5)

是的,这是正确的。

P.S。最好共享相同的会话(可能是有限的并行连接),而不是在每个帖子请求上重新创建一个连接池:

session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=10))