Thread и init одновременно (как это работает?) - PullRequest
0 голосов
/ 07 ноября 2018

Я недавно начал изучать потоки, и я знаю, что речь идет о нескольких процессах обработки, я просто не понимаю, почему это происходит

import threading

class BuckyMessenger(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        print("test")

    def run(self):
        for _ in range(4):
            print(threading.current_thread().getName())

    x = BuckyMessenger(name='Send')
y = BuckyMessenger(name='Receive')
z = BuckyMessenger(name='Nothing')
x.start()
y.start()
z.start()

Я ожидал, что это произойдет:

test
Send
test
Receive
test
Nothing

С этого момента я должен был получить еще 9 отпечатков: 3 случайных «Отправить» и 3 случайных «Получить» и 3 случайных «Ничего», как показано ниже: (остальные результаты)

Send
Receive 
Nothing 
Nothing
Nothing
Send
Receive 
Receive 
send

Но вот результат, который я получил: Я имею в виду почему? почему питон действует так?

test
test
test
Thread-1
Thread-1
Thread-1
Thread-1
Thread-2
Thread-2
Thread-2
Thread-2
Thread-3
Thread-3
Thread-3
Thread-3

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ваш инициализатор не устанавливает переданный name в BuckyMessanger. Это потому, что вы переопределяете исходный Thread.__init__(), который обрабатывает name, как и следовало ожидать. Имена по умолчанию для потоков: Thread-1 и т. Д., В соответствующем порядке их создания. Измените ваш инициализатор на что-то вроде следующего, чтобы переопределить значения по умолчанию:

def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        print("test")

Что касается того, почему они печатаются в таком порядке, BuckyMessanger.run() выполняется после каждого start() и заканчивается до вызова следующего start().

0 голосов
/ 08 ноября 2018

Вам нужно получить ссылку на текущий запущенный поток и установить его имя. Затем вы можете использовать эту ссылку, чтобы напечатать его имя. Обратите внимание на изменения в конструкторе и методе run. Что касается эффекта последовательного выполнения, то это связано с тем, что каждый поток может быть выполнен достаточно быстро и завершен до того, как произойдет другой, из-за небольшого количества циклов цикла:

import threading

class BuckyMessenger(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        print("test")

    def run(self):
        curThread = threading.current_thread()
        curThread.name = self.name
        for _ in range(4):
            print(curThread.name)

x = BuckyMessenger(name='Send')
y = BuckyMessenger(name='Receive')
z = BuckyMessenger(name='Nothing')
x.start()
y.start()
z.start()

Возможный вывод:

test
test
test
Send
Send
Send
Send
Receive
Nothing
Nothing
Receive
Nothing
Nothing
Receive
Receive
...