Я пытаюсь использовать ThreadPoolExecutor()
в методе класса для создания пула потоков, которые будут выполнять другой метод в том же классе. У меня есть with concurrent.futures.ThreadPoolExecutor()...
, но он не ждет, и выдается ошибка, говорящая, что в словаре, который я запрашиваю, не было ключа после оператора «with ...». Я понимаю, почему возникает ошибка, потому что словарь еще не обновлен, потому что потоки в пуле не завершили выполнение. Я знаю, что выполнение потоков не завершено, потому что у меня есть печать («готово») в методе, который вызывается в ThreadPoolExecutor, а «готово» не выводится на консоль.
Я новичок в обсуждениях, поэтому приветствую любые предложения о том, как это сделать лучше!
def tokenizer(self):
all_tokens = []
self.token_q = Queue()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
for num in range(5):
executor.submit(self.get_tokens, num)
executor.shutdown(wait=True)
print("Hi")
results = {}
while not self.token_q.empty():
temp_result = self.token_q.get()
results[temp_result[1]] = temp_result[0]
print(temp_result[1])
for index in range(len(self.zettels)):
for zettel in results[index]:
all_tokens.append(zettel)
return all_tokens
def get_tokens(self, thread_index):
print("!!!!!!!")
switch = {
0: self.zettels[:(len(self.zettels)/5)],
1: self.zettels[(len(self.zettels)/5): (len(self.zettels)/5)*2],
2: self.zettels[(len(self.zettels)/5)*2: (len(self.zettels)/5)*3],
3: self.zettels[(len(self.zettels)/5)*3: (len(self.zettels)/5)*4],
4: self.zettels[(len(self.zettels)/5)*4: (len(self.zettels)/5)*5],
}
new_tokens = []
for zettel in switch.get(thread_index):
tokens = re.split('\W+', str(zettel))
tokens = list(filter(None, tokens))
new_tokens.append(tokens)
print("done")
self.token_q.put([new_tokens, thread_index])
'''
Ожидается, что вы увидите все операторы print("!!!!!!")
и print("done")
перед оператором print ("Hi")
. Фактически показывает !!!!!!!
, затем Hi
, затем KeyError
для словаря результатов.