Целые числа неизменны. Таким образом, вы можете сделать свой счетчик глобальным, используя
global counter
Вы также можете определить глобальный counter
объект (не целое число), используя itertools.count
Это мой предпочтительный метод, потому что он избегает использования global
на неизменяемом объекте, таком как целое число, что всегда приводит к ошибкам и недоразумениям.
import itertools
counter_object = itertools.count() # default: starts at 0
сейчас:
counter = counter+ 1
становится:
counter = next(counter_object)
И значения между рабочими потоками не будут одинаковыми.
Это зависит от того факта, что CPython имеет глобальную блокировку интерпретатора, которая делает работу безопасной. Если вы не используете CPython, вы должны использовать механизмы блокировки потоков, чтобы защитить объект от одновременных изменений.
другая проблема заключается в том, что get_data
должен возвращать не список, а элемент. Пусть executor.map
создаст список (и ваш цикл бесполезен / вреден, поскольку он увеличивает количество вычислений)
Подведем итог:
def get_data(xml):
url = 'url.com/Id={}'.format(xml)
while True:
try:
xml_data1 = requests.get(url).text
counter = next(counter_object)
print(counter)
break
except requests.exceptions.RequestException as e:
print(e)
return xml_data1
наконец, executor.map
сделан для повторения. Чтобы создать список, вам нужно заставить итерировать его:
with futures.ThreadPoolExecutor() as executor:
df_list = list(executor.map(get_data, lst1))