Вариант 1: вы можете передавать аргументы в каждый поток, когда он создается:
ClientThread(arg1, arg2, kwarg1="three times!").start()
, в этом случае будет вызван ваш run
метод:
run(arg1, arg2, kwarg1="three times!")
экземпляром Thread при вызове start()
. Если вам нужно передать изменяемые объекты (диктанты, списки, экземпляры) в функцию, вы должны обязательно переназначить глобальную переменную, не редактировать ее на месте.
Вариант 2: вы можете установить переменную экземпляра для ваших ClientThread
объектов:
myThread.setMyAttribute('new value')
С опцией 2 вам нужно опасаться условий гонки и т. Д. В зависимости от того, что делает метод. Использование Lock
s всякий раз, когда вы пишете или читаете данные из / в поток, - это хорошая идея.
Вариант 3: захватить глобальный объект при первом вызове run
и сохранить копию локально
run(self):
localVar = globalVar # only for immutable types
localList = globalList[:] # copy of a list
localDict = globalDict.copy() # Warning! Shallow copy only!
Вариант 1 - правильный путь, если значение, которое дается потоку, никогда не нужно изменять в течение его срока службы, Вариант 2, если значение действительно нужно изменить. Вариант 3 - это взлом.
Что касается обычно передаваемых переменных / значений, вы должны помнить с Python, что неизменяемые объекты (строки, числа, кортежи) передаются по значению , а изменяемые объекты (dicts, списки, экземпляры классов) передано по ссылке .
Следовательно, изменение строки, числа или кортежа не повлияет на экземпляры, ранее переданные этой переменной, однако изменение dict, списка или экземпляра подойдет. Повторное присвоение переменной другому объекту не повлияет на что-либо ранее, учитывая старое значение.
Globals, конечно, не должен использоваться для значений, которые могут измениться (если вообще). В основном ваш пример делает это неправильно.