#python #arrays #regex #multithreading #dictionary
#python #массивы #регулярное выражение #многопоточность #словарь
Вопрос:
Как я сказал в заголовке, я хочу создать string variables
для Threads
использования input
. И удалять их с помощью flag
.
Мне нужно объяснить этот вопрос шаг за шагом.
- Допустим, я получаю
input
от пользователя. Этоinput
пользователем будет имяThread variable
. - Пусть
input
равноlove
иlike
. В этом случае будет создано 2 переменных потоков и Threads. И их имена будутlove
иlike
. - Для создания
Thread
должен быть указан такой код.
Код:
from threading import Thread
import time
import re
# Using while loop. Because I want to create multiple Threads by doing this.
# Dicts
dicts = {}
flags = {}
while True:
# Input
threadName = input('Thread name please? ')
# To delete a Thread
if 'delete' in threadName:
delThread = re.search(r'delete (.*)', threadName)
if delThread:
delThread = list(map(str, delThread.groups()))
delThread = ''.join(delThread)
print('DELETING:', delThread)
flags[delThread] = True
print('DICT NOW:', flags)
else:
# Target function for every Thread. Print a message every 3 secs.
def targetfunc(tname):
while True:
if flags[tname] in flags and flags[tname] == True:
break
print(f"I'm {tname} Thread.")
time.sleep(3)
# Create Threads. 'dicts[threadName]' will be whatever the user enters input.
# Should be string variable.
# 'threadName' is equal to input too.
dicts[threadName] = Thread(target = targetfunc, args = [threadName])
dicts[threadName].start()
flags[threadName] = False
print(dicts)
print(flags)
Я использую 2 dicts. Один dicts
для создания Threads
, а другой для удаления их с помощью flag
.
Чтобы создать, просто введите, что вы хотите вызвать в Thread.
Чтобы удалить, введите delete (thread name)
.
Ввод от пользователя:
Thread name please? love
{'love': <Thread(Thread-1, stopped 47635696609024)>}
{'love': False}
Thread name please? like
{'love': <Thread(Thread-1, stopped 47635696609024)>, 'like': <Thread(Thread-2, stopped 47635696609024)>}
{'love': False, 'like': False}
Thread name please? delete love
DELETING: love
DICT NOW: {'love': True, 'like': False}
Этот код выдает KeyError
для каждого потока, когда я пытаюсь удалить. Вот полная ошибка.
Ошибка:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "./prog.py", line 27, in targetfunc
KeyError: 'love'
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "./prog.py", line 27, in targetfunc
KeyError: 'like'
Это программа. Как исправить эту проблему?
Чего я хочу добиться, так это:
Когда я ввожу имя, это имя должно создавать новое Thread
с этим именем. Но когда я набираю, delete (thread name)
это должно прекратиться (thread name) Thread
.
Надеюсь, я смог это хорошо объяснить. Надеюсь, вы поможете.
Ответ №1:
Проблема в том, что вы проверяете словарную запись вместо того, чтобы проверять, существует ли этот ключ.
Измените эту строку:
if flags[tname] in flags and flags[tname] == True:
К этому:
if tname in flags and flags[tname] == True:
С этим изменением код выполняется правильно.