Я пытаюсь перебрать многопроцессорный запрос на веб-сайт с помощью 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
Во второй строке:
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)}