2017-09-08 1 views
3

Mein Code ist wie folgt:Python-Paket - aiohttp hat eine Warnmeldung "Unclosed Client-Sitzung"

import asyncio 
import aiohttp 

urls = [ 
    'http://www.163.com/', 
    'http://www.sina.com.cn/', 
    'https://www.hupu.com/', 
    'http://www.csdn.net/' 
] 

async def get_url_data(u): 
    """ 
    read url data 
    :param u: 
    :return: 
    """ 
    print('running ', u) 
    resp = await aiohttp.ClientSession().get(url=u) 
    headers = resp.headers 
    print(u, headers) 
    return headers 


async def request_url(u): 
    """ 
    main func 
    :param u: 
    :return: 
    """ 
    res = await get_url_data(u) 
    return res 

loop = asyncio.get_event_loop() 
task_lists = asyncio.wait([request_url(u) for u in urls]) 
loop.run_until_complete(task_lists) 
loop.close() 

Wenn ich meinen Code ausgeführt wird, dann ist es eine Warnmeldung an: Unclosed Client-Sitzung

Jeder kann mir dazu ein paar Lösungen geben?

Vielen Dank

Antwort

1

Sie ClientSession Asynchron-Kontext-Manager für die ordnungsgemäße Sperrung/Freigabe von Ressourcen verwenden sollte:

async def get_url_data(u): 
    """ 
    read url data 
    :param u: 
    :return: 
    """ 
    print('running ', u) 
    async with aiohttp.ClientSession() as session: 
     resp = await session.get(url=u) 
     headers = resp.headers 
     print(u, headers) 
     return headers 
3

Sie sollten die Verbindung schließen am Ende. Sie haben 2 Möglichkeiten:

import aiohttp 
session = aiohttp.ClientSession() 
# use the session here 
session.close() 

Oder Sie können es mit einem contex Manager verwenden:

Sie die Verbindung manuell schließen kann

import aiohttp 
import asyncio 

async def fetch(client): 
    async with client.get('http://python.org') as resp: 
     assert resp.status == 200 
     return await resp.text() 

async def main(loop): 
    async with aiohttp.ClientSession(loop=loop) as client: 
     html = await fetch(client) 
     print(html) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main(loop)) 

Die Client-Sitzung unterstützt den Kontextmanager Protokoll für Selbsteinzug.