2016-07-19 6 views
4

Ich schreibe App, die Verzeichnis sekündlich scannt, nach neuen Dateien sucht, und wenn sie erschienen - sendet sie per POST-Anfrage und führt Archivierung durch. Unter der Annahme, dass die Anzahl der Dateien, die im Verzeichnis erscheinen können, zwischen 10 und 100 liegen kann, entschied ich mich, asyncio und aiohttp zu verwenden, um Anfragen gleichzeitig zu senden.asyncio. dynamisch hinzufügen Koroutinen zu Schleife

Code:

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

Die Frage ist also: Wenn ich Anfragen gleichzeitig senden möchten, ist dies eine gute Praxis Koroutinen Schleife wie folgt hinzuzufügen: asyncio.ensure_future(publish_file(file))?

Antwort

5

Ja, es ist korrekt.

P.S. Es empfiehlt sich, dieselbe Sitzung (möglicherweise mit einer begrenzten Anzahl paralleler Verbindungen) zu teilen, als einen Verbindungspool für jede Postanforderung neu zu erstellen:

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