我想很快连接到许多不同网站的列表.

我该如何实现这一点?

import ssl
import asyncio
from contextlib import suppress
from concurrent.futures import ThreadPoolExecutor
import time


@asyncio.coroutine
def run():
    while True:
        host = yield from q.get()
        if not host:
            break

        with suppress(ssl.CertificateError):
            reader, writer = yield from asyncio.open_connection(host[1], 443, ssl=True) #timout option?
            reader.close()
            writer.close()


@asyncio.coroutine
def load_q():
    # only 3 entries for debugging reasons
    for host in [[1, 'python.org'], [2, 'qq.com'], [3, 'google.com']]:
        yield from q.put(host)
    for _ in range(NUM):
        q.put(None)


if __name__ == "__main__":
    NUM = 1000
    q = asyncio.Queue()

    loop = asyncio.get_event_loop()
    loop.set_default_executor(ThreadPoolExecutor(NUM))

    start = time.time()
    coros = [asyncio.async(run()) for i in range(NUM)]
    loop.run_until_complete(load_q())
    loop.run_until_complete(asyncio.wait(coros))
    end = time.time()
    print(end-start)

(旁注:有人知道如何优化这个吗?)

推荐答案

您可以将调用包装为open_connection in asyncio.wait_for,这允许您指定超时:

    with suppress(ssl.CertificateError):
        fut = asyncio.open_connection(host[1], 443, ssl=True)
        try:
            # Wait for 3 seconds, then raise TimeoutError
            reader, writer = yield from asyncio.wait_for(fut, timeout=3)
        except asyncio.TimeoutError:
            print("Timeout, skipping {}".format(host[1]))
            continue

请注意,当提升TimeoutError时,open_connection协同路由也会被取消.如果你不想取消(虽然我认为你在这种情况下希望取消),你必须将通话包装为asyncio.shield.

Python-3.x相关问答推荐

循环遍历数据框以提取特定值

为什么我的Selenium脚本在密码元素上失败?

将两列的乘积连续添加到一列的累积和中

如何将日期时间索引写入日期类型的表?

python 分代垃圾收集:get_count 没有报告正确的对象创建数?

如何将列表和字典逐行组合在一起

缺失时推断的数据类可选字段

Einsum 对于张量乘法很慢

python 3.10.5 中可能存在的错误. id 函数工作不明确

导入在不同目录中定义的函数

通过最接近的匹配合并两个不同长度的列上的两个数据框

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

Await Future 来自 Executor:Future 不能在await表达式中使用

ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配

tensorflow 中 numpy.newaxis 的替代方案是什么?

是否在未完成初始化的对象上调用了 del?

如何在 python 3.x 中禁用 ssl 判断?

有没有一种标准方法来确保 python 脚本将由 python2 而不是 python3 解释?

在动态链接库 Anaconda3\Library\bin\mkl_intel_thread.dll 中找不到序数 242

Beautifulsoup 的单元测试失败