asyncio可以和http.client一起使用吗?

时间:2017-06-07 14:28:50

标签: python python-3.x

目前正在使用线程来制作多个"异步"请求下载文件。现在我建议使用asyncio来升级到Python 3 +。

我们必须使用ssl.SSLContext(protocol = ssl.PROTOCOL_TLS)并传递PEM和KEY文件。

我是否可以将http.client脚本转换为与asyncio一起使用,还是需要将http.client函数转换为aiohttp函数?

加成:

无论哪种方式,有人可以概述如何在async def@asyncio.coroutine之间进行选择吗?

支持信息:

考虑到我们的最后一个是顺序查询并且现在与大约15个并发请求并行工作,我的程序表现相当不错。然而,我正在处理的另一个程序向上发送500个并行请求;我可以使用threading.Semaphore()但我已经读过asyncio非常适合大量请求。

第一次搞乱它,所以......

我正在阅读following(并且其中80%似乎是非阻塞套接字的套接字连接,唯一适用的部分是"协调协同程序")。

1 个答案:

答案 0 :(得分:1)

您可以使用aiohttp;您需要翻译http.client代码才能使用aiohttp client API。您可以重复使用ssl.SSLContext()对象;将其传递给TCPConnector() instance,然后从中创建一个客户端:

import aiohttp
import ssl


SSL_CONTEXT = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)
SSL_CONTEXT.load_cert_chain(certfile='foo', keyfile='bar')


async def fetch_url(url):
    conn = aiohttp.TCPConnector(ssl_context=SSL_CONTEXT)
    async with aiohttp.ClientSession(conn=connector) as client:
        async with client.get(url) as response:
            print(resp.status)
            print(await resp.text())

请注意,您无法在客户端会话之间共享连接器;如果您想重新使用,请重复使用客户端。