gpt4 book ai didi

python - 如何使用 asyncio 添加连接超时?

转载 作者:太空狗 更新时间:2023-10-29 17:05:48 24 4
gpt4 key购买 nike

我想快速连接到许多不同站点的列表。我使用 asyncio 以异步方式执行此操作,现在想如果响应时间太长,则应在何时忽略连接时添加超时。

我该如何实现?

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 的调用包装在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 - 如何使用 asyncio 添加连接超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com