Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python asyncio可以与http.client一起使用吗?_Python_Python 3.x - Fatal编程技术网

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

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之间进行选择吗

当前正在使用线程发出多个“异步”请求以下载文件。现在我们已经升级到Python 3+,有人建议我考虑使用
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:是的,你需要这样做,你需要启动一个事件循环,并在该循环下运行异步任务。我在这里没有包括这一点,我只是将异步函数作为一个示例包含在请求中。如果您需要一个完整的异步教程,那么这将很快变得过于宽泛。