Добавить аргумент исправления в карту - Python - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь выполнить итерацию метода и передать другие аргументы, необходимые этому методу. Для этого я думаю, что лучше всего использовать метод map ().

Точнее, мне нужно выполнить несколько DNS-запросов (A / AAAA / NS / MX) для нескольких FQDN (полностью определенное доменное имя, ie: www.mywebsite.com).

Поскольку запросы могут ждать несколько секунд в ожидании ответа, я использую потоки для компенсации.

Вот мой фактический код:

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 и требует FQDN и RDTYPE ( A / AAAA / NS / MX)

Я хочу, чтобы map () выполнялся по FQDN , и я также хочу иметь возможность передавать RDTYPE как нормальный аргумент.

Пока я понял, что это не цель карты. Но решения, похоже, существуют: Решения Functools или Itertools

К сожалению, я не могу их понять, и применимы ли они к моему случаю.

Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2020

Думаю, это решение может сработать для вас:

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

отображение по списку динамических c 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 ...

, затем я собираю результаты (n результатов, определенных fqdn_list.size ()) на ips и ipv6s генератора

и, наконец, я перебираю их.

Наблюдение: я не тестировал его.

РЕДАКТИРОВАТЬ: Я использовал 'rdtype_freezed_arg' в качестве имени аргумента для дидактических целей, вы следует использовать имя аргумента, используемое в объявлении функции.

...