首页 > 解决方案 > 在地图中添加修复参数 - Python

问题描述

我正在尝试迭代一个方法并传递该方法需要的其他参数。为此,我认为我最好的方法是使用 map() 方法。

更准确地说,我需要在几个 FQDN(完全合格的域名,即:www.mywebsite.com)上执行几个 dns 请求(A / AAAA / NS / MX)。

由于请求可以等待几秒钟等待答案,我正在使用线程来补偿。

这是我的实际代码:

with ThreadPoolExecutor(max_workers=4) as executor:
        for fqdn in fqdn_list:
            future_01 = executor.submit(get_dns_query, fqdn, 'A')
            future_02 = executor.submit(get_dns_query, fqdn, 'AAAA')

            ip = future_01.result()
            ipv6 = future_02.result()

现在我认为最好的是:

with ThreadPoolExecutor(max_workers=4) as executor:
        ip = executor.map(get_dns_query, fqdn, 'A')
        ipv6 = executor.submit(get_dns_query, fqdn, 'AAAA')

get_dns_query将执行 dns 请求并需要FQDNRDTYPE (A / AAAA / NS / MX)

我希望map()在FQDN上进行迭代,并且我还希望能够将RDTYPE作为普通参数传递。

到目前为止,我明白这不是地图的目的。但似乎存在解决方案: Functools 或 Itertools 解决方案

不幸的是,我无法理解它们以及它们是否适用于我的情况。

有任何想法吗?

标签: python-3.xmultithreadingloopsdns

解决方案


我认为这个解决方案可以为你工作:

import functools


fqdn_list = ['www.google.com', 'www.facebook.com']

with ThreadPoolExecutor(max_workers=4) as executor:
        ips = executor.map(functools.partial(get_dns_query, rdtype_freezed_arg='A'), fqdn_list)
        ipsv6 = executor.map(functools.partial(get_dns_query, rdtype_freezed_arg='AAAA'), fqdn_list)

## SOME CODE

for ip in ips:
    print(ip)


for ipv6 in ipv6s:
    print(ipv6)

我所做的是:我想象的 get_dns_query 函数的“冻结”部分需要 2 个参数

def get_dns_query(rdtype, fqdn):
# lines of code

将其映射到动态 args 'fqdn_list' 列表中,所以它的行为如下:

get_dns_query(rdtype_freezed_arg='A', fqdn_list[0])
get_dns_query(rdtype_freezed_arg='A', fqdn_list[1])
# and so on ...

然后我在生成器 ips 和 ipv6s 上收集结果(n 个结果,由 fqdn_list.size() 定义)

最后我遍历它们。

观察:我没有测试它。

编辑:出于教学目的,我使用 'rdtype_freezed_arg' 作为 arg 名称,您应该使用函数声明中使用的 arg 名称。


推荐阅读