используя python concurrent.futures представьте с нумерацией процессов

1

Я пытаюсь перебрать многопроцессорный запрос на веб-сайт с помощью python 3. Я использовал модифицированную версию кода примера из https://docs.python.org/3/library/concurrent.futures.html примера 17.4.2.1. Пример ThreadPoolExecutor

    with concurrent.futures.ProcessPoolExecutor(max_workers=self.load) as executor:
        futureThreadVer = {executor.submit(self.get_code(), 60):x for x in range(self.load)}
        for future in concurrent.futures.as_completed(futureThreadVer):
            threadVer = futureThreadVer[future]
            try:
                data=future.result()
            except Exception as exc:
                print("%r generated an exception : %s" %(threadVer, exc))
            else:
                print("%r page data %r" % (self.page, data))

Это модификация кода примера из https://docs.python.org/3/library/concurrent.futures.html примера 17.4.2.1. Пример ThreadPoolExecutor

Вместо того, чтобы сопоставлять потоки с URL-адресом, я хочу, чтобы был добавлен номер процесса, потому что я запрашиваю тот же URL-адрес в разных процессах.

Я получаю следующую ошибку:

3 generated an exception : 'int' object is not callable
1 generated an exception : 'int' object is not callable
0 generated an exception : 'int' object is not callable
2 generated an exception : 'int' object is not callable
4 generated an exception : 'int' object is not callable
Теги:
python-3.x
concurrency
concurrent.futures

1 ответ

1
Лучший ответ

Во второй строке:

futureThreadVer = {executor.submit(self.get_code(), 60):x for x in range(self.load)}

Вызов executor.submit содержит вызов функции. Вместо этого она должна быть ссылкой на функцию. Итак, что происходит, вместо того, чтобы вызывать функцию внутри исполнителя, функция self.get_code в основном потоке, а self.get_code вероятно, возвращает целое число, которое фактически передается исполнителю. Затем исполнитель пытается вызвать это целое число, считая его функцией. Это происходит из-за того, что python поддерживает утиную печать, и исполнитель ожидает, что первым аргументом будет объект функции.

Поэтому измените свою вторую строку на:

futureThreadVer = {executor.submit(self.get_code, 60):x for x in range(self.load)}
  • 0
    Мне пришлось избавиться от значения тайм-аута для этого, что позже может вызвать проблему ... поэтому вместо этого строка выглядит как submit () self.get_code): .... Проблема, которую она выдает, заключается в том, что "get_code () принимает 1 позиционный аргумент, но 2 были даны ".... Редактировать, кажется, я избавился от тайм-аута из моего кода против примера кода, который я использовал в качестве основы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню