【发布时间】:2014-09-21 08:18:05
【问题描述】:
我正在尝试编写一个发送多个 DNS 请求的 python 脚本,每个请求使用不同的名称服务器。
使用 dnspython 实现顺序解决方案很容易,但对我来说太慢了。 使用线程池添加并发是不可能的,因为在我的特殊情况下,所有请求都使用相同的源端口(REUSE_ADDRESS 在这里也无济于事)。
由于上述原因,我正在考虑使用以下解决方案(放弃使用 dnspython 的解析器模块,但利用其消息构建和解析模块):
- 最多允许进行 X 个请求
- 同时发送 X 个请求(仅使用 udp 发送 dns 请求数据包。可能会在发送之间增加延迟以避免突发)
- 另一个线程等待响应
- 当响应到达时,将其与请求匹配(按地址)并允许运行新请求
- 如果对请求的响应未在 TIMEOUT 秒内到达,则将其标记为已完成并允许运行新请求
我的主要问题是:
- 如何轻松实现任务超时
- 是否可以在不使用线程同步的情况下实现它(例如使用事件循环?)
- 是否有任何现有的库可以帮助实现它(感觉就像我在这里尝试重新发明轮子,我查看了 asycnio 模块但无法找到一种方法来利用它来解决我的问题)。请注意,我不想使用现有的 dns 或网络库,因为我需要灵活地更改核心功能(例如,使用原始套接字、更改 DNS 标头字段等)。
【问题讨论】:
标签: python sockets dns task python-asyncio