Как создавать строковые переменные для потоков и удалять их с помощью флага

#python #arrays #regex #multithreading #dictionary

#python #массивы #регулярное выражение #многопоточность #словарь

Вопрос:

Как я сказал в заголовке, я хочу создать string variables для Threads использования input . И удалять их с помощью flag .

Мне нужно объяснить этот вопрос шаг за шагом.

  1. Допустим, я получаю input от пользователя. Это input пользователем будет имя Thread variable .
  2. Пусть input равно love и like . В этом случае будет создано 2 переменных потоков и Threads. И их имена будут love и like .
  3. Для создания 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:
  

С этим изменением код выполняется правильно.