Ошибка "cannot schedule new futures after interpreter shutdown" при работе с boto3 а тредах на Python3.9+
Доброго вам времени суток. Возникла у меня проблема, которую решить не выходит вот уже несколько дней. Суть: Есть приложение, которое собирает Json файлы и отправляет их на амазоновский s3 через библиотеку boto3. Приложение разрабатывалось на Python 3.8 и там никаких проблем не возникало. Решили идти в ногу со временем и обновили Python до 3.9+ и начались проблемы. В проекте используется мультитрединг, для которого задан новый класс.
class NewThread(Thread):
def __init__(self, name):
Thread.__init__(self)
self.name = name
def run(self):
global i, listings
if self.name=='control':
# Тут код контроллирующего треда, для теста не нужен
while True:
time.sleep(10)
else:
i += 1
print(f'Thread {self.name} works on {files[i]}')
try:
create_file(files[i])
move_file(c.root+f'json/{files[i].replace(".", "-")}.json', 's3folder')
except Exception as e:
get_exception(e)
Функция create_file() довольно длинная и с кучей условий но в целом там создается файл json на 20-25кб. После этого файл должен быть отправлен на сервер через move_file(). Вот ее код:
# Function for moving files to s3 bucket
def move_file(file, path, bucket=c.s3cfg['bucket'], folder=c.s3cfg['folder']):
s3 = boto3.client('s3', aws_access_key_id=c.s3cfg['access_key'], aws_secret_access_key=c.s3cfg['secret_key'])
name = file.split('/')
name = folder + '/' + path + '/' + name[len(name) - 1]
try:
s3.upload_file(file, bucket, name)
os.remove(file)
except Exception as e:
get_exception(e)
Треды запускаются через это:
def start_thread(count=5):
NewThread(name='control').start()
for i in range(count):
name = f'thread_{i+1}'
threads[name] = NewThread(name=name)
threads[name].start()
time.sleep(0.5)
Вот текст ошибки:
cannot schedule new futures after interpreter shutdown; Place: script.py; Line: 49;
Это строка с s3.upload_file(file, bucket, name) в моем коде. Причем срабатывает эта ошибка не каждый раз. Бывает пропустит сперва пару файлов на сервер и после начинает выпендриваться. Сам по себе boto3 и конкретно функция отправки файла на сервер работают хорошо. Более того, весь этот код прекрасно работает на прошлой версии python. Возникает ощущение, что одна итерация отправки файла ставит какую-то глобальную переменную в состояние shutdown=True и после этого скрипт не работает. Помогите понять, в чем проблема и как ее можно решить, пожалуйста.
Ответы (1 шт):
Для решения данной проблемы оказалось достаточно добавить join() после старта тредов. В своем примере я не уточнил, что треды рестартуют из контрола, где я и запамятовал поставить этот самый join когда сам пробовал исправить проблему его использованием.
def start_thread(count=5):
NewThread(name='control').start()
for i in range(count):
name = f'thread_{i+1}'
threads[name] = NewThread(name=name)
threads[name].start()
thread[name].join()
time.sleep(0.5)