Python asyncio可以与http.client一起使用吗?
当前正在使用线程发出多个“异步”请求以下载文件。现在我们已经升级到Python 3+,有人建议我考虑使用Python asyncio可以与http.client一起使用吗?,python,python-3.x,Python,Python 3.x,当前正在使用线程发出多个“异步”请求以下载文件。现在我们已经升级到Python 3+,有人建议我考虑使用asyncio 我们必须使用ssl.SSLContext(protocol=ssl.protocol\u TLS)并传递PEM和密钥文件 我是否可以将我的http.client脚本转换为与asyncio一起使用,或者我是否需要将http.client函数转换为aiohttp函数 奖金: 不管是哪种方式,有人能概述一下如何在async def和@asyncio.coroutine之间进行选择吗
asyncio
我们必须使用ssl.SSLContext(protocol=ssl.protocol\u TLS)并传递PEM和密钥文件
我是否可以将我的http.client
脚本转换为与asyncio
一起使用,或者我是否需要将http.client
函数转换为aiohttp
函数
奖金:
不管是哪种方式,有人能概述一下如何在async def
和@asyncio.coroutine
之间进行选择吗
支持信息:
我的程序执行得相当好,考虑到我们的上一个是顺序查询,现在与大约15个并发请求并行工作。然而,我正在开发的另一个程序同时向上发送500个请求;我可以使用threading.Semaphore()
,但我已经读到asyncio
非常适合大容量请求
第一次搞砸了,所以
我正在阅读(其中80%似乎是非阻塞套接字的套接字连接,唯一适用的部分是“协调协同路由”) 您可以使用
aiohttp
;您需要翻译要使用的http.client
代码。您可以重复使用ssl.SSLContext()
对象;将其传递给,然后从中创建客户端:
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())
请注意,您不能在客户端会话之间共享连接器;如果您想重复使用,请重新使用客户端。另外:您的Python版本是否支持
async
/await
语法?然后使用它。在语法就位之前,decorator只是一个中途停留。是的,您希望使用asyncio和aiohttp。后者应该很好地支持SSL(您可以将SSL.SSLContext()
传递给TCPConnector,然后将其传递给ClientSession)。并且使用Python 3.5或(最好)3.6,这样您就可以随时随地使用async
/wait
,忘掉@asyncio.coroutine
。看看@deceze如何确定哪些函数需要异步
?例如,main()。如果我去掉了子类,但将其功能转换为独立的def()
,我会将async
仅与该功能结合使用吗?连接需要是HTTPS,所以aiohttp
是否可以支持该功能以及偶尔需要代理?另外,您没有导入asyncio
,而是声明了async
;你能做到吗???@madeslurpy:aiohttp
支持SSL连接,并且(根据请求或客户机配置)。async
语法是该语言的一部分,您不必导入asyncio
来启用它。那么何时/为什么需要导入asyncio
?我读过的所有示例都调用get\u event\u loop()
和run\u直到完成()。我不需要它们来同时发出500个并行文件下载请求吗?@madeslurpy:是的,你需要这样做,你需要启动一个事件循环,并在该循环下运行异步任务。我在这里没有包括这一点,我只是将异步函数作为一个示例包含在请求中。如果您需要一个完整的异步教程,那么这将很快变得过于宽泛。